metodospool - pool de conexiones web java
Pool de conexión sobre nueva instancia de conexión por subproceso(JDBC) (1)
Estoy creando una aplicación multiproceso. Sin embargo, he experimentado muchos comportamientos inesperados de mi aplicación cuando tengo un objeto de conexión que sirve todos los hilos.
Estoy en un dilema ¿Debo dejar que cada hilo cree, use y elimine su propio objeto de conexión o debería usar un grupo de conexiones?
He intentado la agrupación de conexiones, lo que hace que la aplicación se disuelva dolorosamente. Sin embargo, mi intuición es que si dejo que cada subproceso cree su propio objeto de conexión, es posible que obtenga un error de "demasiadas conexiones".
Por favor, avíseme si hay alguna manera de ayudar en esto.
Saludos.
Independientemente del problema de subprocesamiento, definitivamente debe elegir un grupo de conexión. Aumentará en gran medida el rendimiento de conexión. Luego, para el problema de la rosca, este es realmente un problema importante. La expresión normal de JDBC es adquirir y cerrar todos los recursos en el ámbito más corto posible . Es decir, todo debería suceder en el mismo bloque de métodos. Los síntomas del problema que está describiendo confirman que no está cerrando esos recursos correctamente.
El cierre siempre debe ocurrir independientemente de si la conexión proviene de un grupo o no. Cerrar una conexión no compartida evitará que la base de datos agote el tiempo de espera cuando se ha mantenido abierta durante un tiempo demasiado prolongado. Cerrar una conexión agrupada la liberará de nuevo al grupo y la pondrá a disposición para el siguiente arrendamiento.
Así es como se ve la expresión JDBC normal para el caso de un INSERT
.
public void create(Entity entity) throws SQLException {
// Declare.
Connection connection = null;
PreparedStatement statement = null;
try {
// Acquire.
connection = database.getConnection();
statement = connection.prepareStatement(SQL_CREATE);
// Use.
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
} finally {
// Close.
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
}