¿Por qué OracleConnection no se devuelve al grupo?

¿Por qué OracleConnection no se devuelve al grupo?

Tengo un problema que no encontré en Internet.

Estoy intentando conectarme a la base de datos con ojdbc6. Obtengo recursos de jndi

<Resource name="jdbc/ds_conn" type="javax.sql.DataSource" maxTotal="10" 
url="jdbc:oracle:thin:@someDB.com:1731/nameDB" 
driverClassName="oracle.jdbc.OracleDriver" 
connectionProperties="SetBigStringTryClob=true; 
oracle.net.READ_TIMEOUT=5000;" password="pass" username="user"
maxWait="10000" maxIdle="300" maxActive="1000" auth="Container"/>

con el método

public OracleConnection getConnection() throws OracleDatabaseReaderConnectionException, NamingException {

    Context initialContext = null;
    try {
        initialContext = new InitialContext();
        DataSource dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/ds_conn");
        OracleConnection connection = (OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);
        return connection;
    } catch (NamingException | SQLException e) {
        e.printStackTrace();
        throw new OracleDatabaseReaderConnectionException(e.getMessage());
    } finally {
        if (initialContext != null) {
            initialContext.close(); 
        }
    }
}

y luego estoy ejecutando query

try (OracleConnection connection = getConnection();
    OraclePreparedStatement preparedStatement = (OraclePreparedStatement) connection.prepareStatement(sqlQuery);
        OracleResultSet resultSet = (OracleResultSet) preparedStatement.executeQuery()) {

    //some actions

} catch (OracleDatabaseReaderConnectionException | SQLException | NamingException e) {
        throw new OracleDatabaseReaderException(e.getMessage());
}

}

Según tengo entendido, es una acción habitual conectarse a la base de datos y ejecutar la consulta.

Pero la conexión no se cierra. Como puede ver en mi jndi, tengo param maxTotal="10". Entonces, después de 10 consultas, el grupo se llena y otras consultas solo esperan un lugar en el grupo. No sé cómo resolver este problema y cerrar las conexiones. ¿Tal vez tengo un conflicto al enviar Connection a OracleConnection, etc.? ¿Tal vez tu-con-recursos no funciona bien?

Mostrar la mejor respuesta

try-with-resources simplemente llama a connection.close() al final. Funciona bien.

¿Te has encontrado con algún error o excepción? si es así, por favor comparte

@Afgan, desafortunadamente no hay excepciones. Las nuevas conexiones están esperando sin cesar sin excepciones.

Según su código, no he visto ningún lugar donde tenga una conexión cercana o no

@Afgan, uso try-with-resources (ejemplo de código 3). se cierra solo después de intentar bloquear.

Lo siento, me perdí el error porque estaba completamente a la derecha.

El problema es que estás cerrando el OracleConnection interno en lugar del envoltorio externo. La diferencia es que el primero realmente cierra la conexión, mientras que cerrar el envoltorio solo devolverá la conexión al grupo.

(OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);

Aquí, llamar a unwrap() hace que el contenedor de agrupación desaparezca y ya no puede llamar a close. Una forma de solucionar esto sería llamar a unwrap() solo después de iniciar un try-with-resources, así:

try (Connection connection = getConnection()) {  // Now the pooled connection will be "closed"
    OracleConnection oc = connection.unwrap(OracleConnection.class);

    try(OraclePreparedStatement ps ...) ...

Pero eso no es muy bonito, al menos si necesitas hacerlo en muchos lugares. ¿Es absolutamente necesario usar las clases específicas de Oracle en lugar de las interfaces JDBC aquí?

Buena respuesta, tnx. Es absolutamente necesario utilizar OraclePreparedStatement. Necesito los métodos prepareStatement.setStringAtName(..) y prepareStatement.setNullAtName(..) y así sucesivamente.

@Adey, si los está utilizando para fines CLOB, me sorprendería si no pudiera solucionarlo de alguna manera. Sin embargo, si no haces eso en todas partes, realmente no importa.