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.