maxwait datos configurar conexiones conexion conectar java mysql jdbc

java - datos - ¿Cómo forzar la reutilización de conexiones en el conjunto jdbc?



pool de conexiones java oracle (2)

No dices lo que estás usando para un grupo de conexiones, por lo que la respuesta es "tal vez".

Sin embargo, la mayoría de las agrupaciones tienen alguna forma de detectar conexiones abandonadas. Por ejemplo, DBCP le proporciona los parámetros de configuración removeAbandoned y removeAbandonedTimeout . Esto no devolverá inmediatamente la conexión al grupo, por lo que aún verá crecer la cantidad de conexiones hasta que expire el tiempo de espera (y con suerte, dado que está en un círculo cerrado, ha establecido un máximo en la cantidad de conexiones). conexiones abiertas).

Tengo un Runnable que obtiene una conexión de un grupo de conexiones como el siguiente y tiene 60 segundos para hacer algo con la conexión:

private static ConnectionPoolDataSource cpds; // MysqlConnectionPoolDataSource public void run(){ while((System.currentTimeMillis()-created)<60000){ try(Connection conn = cpds.getPooledConnection().getConnection()){ //do something }catch(SQLException sqle){} } }

Cuando el hilo muere después de los 60s, supongo que la conexión se devuelve al grupo y cuando se crea un nuevo hilo, la conexión se puede reutilizar. Pero cuando enumero mis conexiones de red, la lista sigue creciendo a medida que se crean más hilos. ¿Las conexiones creadas anteriormente se devuelven correctamente a la agrupación? En caso afirmativo, ¿cómo puedo obligar a volver a utilizar las conexiones?


En realidad, no está utilizando un grupo de conexiones. Un ConnectionPoolDataSource no está destinado a ser utilizado directamente. Está pensado como un DataSource (especial) para objetos PooledConnection que luego se mantienen en un conjunto de conexiones mediante una implementación DataSource (normal) que proporciona la agrupación de conexiones.

Un desarrollador normal no debe usar ConnectionPoolDataSource directamente, está destinado a ser utilizado con grupos de conexiones proporcionados por los Servidores de aplicaciones, o debe estar envuelto en DataSource propósito general que proporcionó la agrupación de conexiones.

Cuando se solicita una Connection desde el grupo de conexiones, se comprueba una PooledConnection existente (o solicita una nueva de su ConnectionPoolDataSource ), recupera una Connection y se lo devuelve al usuario. Cuando el usuario cierra la Connection , PooledConnection indicará al grupo de conexiones que está disponible nuevamente.

En este caso, está creando una PooledConnection , recuperando una Connection de ella y luego descartando la PooledConnection . Esto significa que PooledConnection se abandona, y su conexión física a la base de datos no se puede reutilizar y se cerrará / descartará cuando finalmente se recolecte basura (normalmente cuando el grupo de conexiones quiere cerrar la conexión física, llamará a close() en el PooledConnection ).

Usted necesita usar la agrupación de conexiones según lo provisto por su servidor de aplicaciones, o usar un grupo de conexiones de propósito general como DBCP, c3p0 o BoneCP.