hacer datos conexiones conexion como cerrar java mysql jdbc glassfish connection-pooling

java - datos - Prácticas de agrupación de conexiones JDBC MySql para evitar el grupo de conexiones agotadas



pool de conexiones spring (2)

Tengo una aplicación web Java-JSF en GlassFish, en la que quiero usar la agrupación de conexiones. Por lo tanto, creé un bean con ámbito de application que sirve con instancias de Connection para otros beans:

public class DatabaseBean { private DataSource myDataSource; public DatabaseBean() { try { Context ctx = new InitialContext(); ecwinsDataSource = (DataSource) ctx.lookup("jdbc/myDataSource"); } catch (NamingException ex) { ex.printStackTrace(); } } public Connection getConnection() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException { Connection connection = myDataSource.getConnection(); System.out.println("Succesfully connected: " + connection); //Sample: Succesfully connected: com.sun.gjc.spi.jdbc40.ConnectionHolder40@7fb213a5 return connection; } }

De esta manera, el grupo de conexiones se llena muy rápido; después de algunas navegación a través de vistas ''relacionadas con db'', la aplicación se detiene con lo siguiente:

RAR5117: Error al obtener / crear conexión desde el grupo de conexiones [mysql_testPool]. Motivo: las conexiones en uso son iguales al tamaño máximo de la agrupación y al tiempo máximo de espera expirado. No se puede asignar más conexiones. RAR5114: Error al adjudicar conexión: [Error al asignar una conexión. Causa: las conexiones en uso son iguales a max-pool-size y expired max-wait-time. No se pueden asignar más conexiones.] Java.sql.SQLException: error al asignar una conexión. Causa: las conexiones en uso son iguales a max-pool-size y expired max-wait-time. No se puede asignar más conexiones.

Estoy cerrando conexiones y otros recursos en cada método. La aplicación ejecuta todo OK con conexiones independientes.

¿Qué estoy haciendo mal? Cualquier consejo o consejo sería apreciado.


La excepción indica un caso típico de código de aplicación que filtra conexiones de bases de datos. Debe asegurarse de adquirir y cerrar todas ellas ( Connection , Statement y ResultSet ) en un bloque try-with-resources en el mismo bloque de método según la expresión JDBC normal.

public void create(Entity entity) throws SQLException { try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_CREATE); ) { statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } }

O cuando no estás en Java 7, en un bloque try-finally . Cerrarlos finally garantizará que también estén cerrados en caso de excepciones.

public void create(Entity entity) throws SQLException { Connection connection = null; PreparedStatement statement = null; try { connection = dataSource.getConnection(); statement = connection.prepareStatement(SQL_CREATE); statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } finally { if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } }

Sí, aún necesita cerrar las conexiones usted mismo, incluso cuando usa la agrupación de conexiones. Es un error común entre los principiantes pensar que automáticamente manejará el cierre. Esto no es verdad El grupo de conexiones devuelve una conexión envuelta que hace algo como lo siguiente en close ():

public void close() throws SQLException { if (this.connection is still eligible for reuse) { do not close this.connection, but just return it to pool for reuse; } else { actually invoke this.connection.close(); } }

Si no se cierran, la conexión no se devolverá al grupo para su reutilización y, por lo tanto, adquirirá una nueva una y otra vez hasta que la base de datos se quede sin conexiones, lo que hará que su aplicación falle.

Ver también:


Si necesita la agrupación de conexiones JDBC, ¿por qué no confía en lo que ya está disponible? AFAIK, la agrupación de conexiones JDBC se considera más o menos una característica estándar en estos servidores de aplicaciones java, y en IMO, no debería querer compilarlo usted mismo si solo está interesado en crear una aplicación.

Aquí hay un enlace que debería comenzar: http://weblogs.java.net/blog/2007/09/12/totd-9-using-jdbc-connection-pooljndi-name-glassfish-rails-application

Lo que probablemente debería hacer es averiguar cómo permitir que su aplicación obtenga una conexión del grupo mediante jndi.