Nuestra sección de código estándar para usar JDBC es ...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
Pregunta 1: Al usar el grupo de conexiones, ¿se debe cerrar la conexión al final? Si es así, ¿no se pierde el propósito de la agrupación? Y si no es así, ¿cómo sabe el origen de datos cuándo se libera una instancia particular de Connection y se puede reutilizar? Estoy un poco confundido en este caso, se agradecen los consejos.
Pregunta 2: ¿El siguiente método se acerca al estándar? Parece un intento de obtener una conexión desde el grupo, y si no se puede establecer DataSource, use el DriverManager antiguo. Ni siquiera estamos seguros de qué parte se está ejecutando en tiempo de ejecución. Repitiendo la pregunta anterior, ¿debería uno cerrar la conexión que surge de dicho método?
Gracias, - MS.
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Editar: creo que estamos obteniendo la conexión agrupada ya que no vemos un seguimiento de pila.
fuente
getConnection()
es extraño. Simplemente hágalo en c'tor o bloque de inicialización de la misma clase, sin sincronización / nulos. Solo se llamará una vez. Para obtener más sugerencias y ejemplos iniciales, este artículo puede resultarle útil.close()
a todos en elfinally
bloque del mismotry
bloque donde los adquirió / creó. Esto es completamente independientemente de si se trata de una conexión agrupada o no.Las agrupaciones normalmente le devuelven un objeto Connection envuelto, donde se anula el método close (), y normalmente devuelve la conexión a la agrupación. Llamar a close () está bien y probablemente aún sea necesario.
Un método close () probablemente se vería así:
Para su segunda pregunta, puede agregar un registrador para mostrar si el bloque inferior se ejecuta alguna vez. Me imagino que solo querría una forma u otra para la configuración de las conexiones de su base de datos. Solo usamos un grupo para nuestros accesos a la base de datos. De cualquier manera, cerrar la conexión sería muy importante para evitar fugas.
fuente
Calling close() is OK and probably still required.
, no llamar a cerrar filtrará la conexión, a menos que el grupo implemente alguna estrategia de recuperaciónEn realidad, el mejor enfoque para la gestión de conexiones es no distribuirlas en ningún código en ningún lugar.
Cree una clase SQLExecutor que sea la única ubicación que abre y cierra conexiones.
El resto de la aplicación luego bombea declaraciones al ejecutor en lugar de obtener conexiones del grupo y administrarlas (o administrarlas mal) por todas partes.
Puede tener tantas instancias del ejecutor como desee, pero nadie debería escribir código que abra y cierre conexiones en su propio nombre.
Convenientemente, esto también le permite registrar todo su SQL desde un solo conjunto de código.
fuente