Tengo un Java-JSF Aplicación Web en el servidor GlassFish, en el que quiero utilizar la agrupación de conexiones. Por lo tanto, he creado un application ámbito de frijol que se sirve con Connection instancias para otros granos:

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: [email protected]
        return connection;
    }
}

De esta manera la conexión de la piscina se llena muy rápido; después de un par de navegación a través de ‘db relacionados con los puntos de vista, la aplicación se detiene con la siguiente:

RAR5117 : Error al obtener/crear una conexión de conexión de la piscina [ mysql_testPool ]. Razón : En uso de las conexiones de la igualdad de max-pool-size y vencidos max-tiempo de espera. No puede asignar más conexiones. RAR5114 : Error de asignación de conexión : [Error en la asignación de una conexión. Causa: En uso de las conexiones de la igualdad de max-pool-size y vencidos max-tiempo de espera. No puede asignar más conexiones.] java.sql.SQLException: Error en la asignación de una conexión. Causa: En uso de las conexiones de la igualdad de max-pool-size y vencidos max-tiempo de espera. No puede asignar más conexiones.

Estoy cierre de conexiones y otros recursos en cada método. La aplicación funciona todo OK con independiente de las conexiones.

¿Qué estoy haciendo mal? Cualquier sugerencias o consejos se agradece.

OriginalEl autor Daniel Szalay | 2010-02-22

2 Comentarios

  1. 20

    La excepción indica un caso típico de aplicación de código que las fugas de conexiones de base de datos. Usted necesita asegurarse de que usted adquiere y cerca de todos ellos (Connection, Statement y ResultSet) en un try-con-recursos bloque en el mismo método de bloque según la normal JDBC idioma.

    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á en Java 7, en un try-finally bloque. El cierre en finally garantizará que también cierran 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í, usted todavía necesita para cerrar las conexiones de ti mismo, incluso cuando se utiliza la agrupación de conexiones. Es un error común entre los /as participantes que piensan que va a continuación, manejar automáticamente el cierre. Este es no es cierto. La conexión de la piscina es decir, devuelve un envuelto de conexión que hace algo como lo siguiente en el 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();
        }
    }

    No cierran podrían provocar que la conexión no se libera de nuevo a la piscina para su reutilización y por lo tanto se va a adquirir uno nuevo de nuevo y de nuevo hasta que el DB se ejecuta fuera de las conexiones que hará que la aplicación se bloquee.

    Véase también:

    Gracias por tu respuesta detallada, fue realmente útil! He editado mi comentario con la aplicación de las modificaciones.
    Gracias por la gran información de nuevo!

    OriginalEl autor BalusC

  2. 0

    Si usted necesita de conexión de JDBC de la agrupación, ¿por qué no confiar en lo que está disponible ya? AFAIK, conexión JDBC agrupación es considerada más o menos una característica estándar en estos servidores de aplicaciones java, y de la OMI, usted no debe querer construirlo usted mismo si usted está interesado en la creación de una aplicación.

    He aquí un enlace que debe comenzar:
    http://weblogs.java.net/blog/2007/09/12/totd-9-using-jdbc-connection-pooljndi-name-glassfish-rails-application

    Lo que probablemente se debe hacer es averiguar cómo permitir que su solicitud tomar una conexión de la piscina usando jndi.

    Él ya está haciendo eso? Él ya ha configurado una conexión de origen de datos agrupados en el appserver. Él sólo y no el cierre de los recursos como por la excepción.
    oh, mierda, tienes razón. gracias BalusC.

    OriginalEl autor Roland Bouman

Dejar respuesta

Please enter your comment!
Please enter your name here