8

Mi aplicación ejecuta múltiples consultas en varios subprocesos.Multithreading con Apache DBCP

Ahora estoy creando una nueva conexión para cada consulta y quiero usar el grupo para mejorar la eficiencia.

¿Puede la agrupación DBCP de Apache trabajar en múltiples subprocesos simultáneamente, o se "bloqueará" en algunos métodos sincronizados por cada subproceso?

Si bloquea, ¿puedo usar algo más?

ACTUALIZACIÓN

En este artículo: link declaró:

Porque se sincronizan todos los métodos de la API JDBC de Oracle, si dos hilos intenta utilizar el objeto de conexión de forma simultánea, a continuación, uno será obligado a esperar hasta que el otro termine su uso.

Supongo que DBCP no será capaz de lidiar con eso?

También me estoy dando cuenta de que en este escenario el grupo no me ayudará, porque cada hilo pedirá una conexión y el hilo generará una nueva conexión cada vez (hasta que algunos de los hilos finalicen y devuelva la conexión a el conjunto)

+1

Para complementar las excelentes respuestas a continuación, el único momento en que 'getConnection()' puede bloquearse es si ya no tiene 'Conexión' en su grupo (es decir, todas están ejecutando transacciones con su base de datos). Pero tan pronto como se haya completado una transacción, la 'Conexión' se devolverá a su grupo y 'getConnection()' devolverá una instancia de 'Conexión' válida. Aunque todo esto dependerá de la configuración de su grupo. – Jeach

Respuesta

2

Sí, Apache DBCP puede funcionar en varios subprocesos al mismo tiempo. "bloque" se produce cuando el código de cliente getConnection() para garantizar el comportamiento correcto en condiciones de carrera, por ejemplo, una instancia Connection no debe obtenerse mediante dos solicitudes concurrentes getConnection(). Después de ese código de cliente maneja las instancias Connection.

El escenario concurrente es una gran preocupación en la agrupación del lado del servidor, como el popular Apache DBCP. Por lo tanto, creo que DBCP realiza bien el comportamiento en multi-hilo, aunque no me sumerjo en la profundidad de la biblioteca.

y Apache DBCP simplemente ofrece conexión JDBC puesta en común de, código de cliente debe utilizar los Connection casos en forma correcta multi-hilos que el DBCP no puede garantizar.

+0

No estoy seguro de si estoy en lo cierto, pero creo que algunos de los métodos de PreparedStatement que la conexión devuelve están sincronizados. Si es así, la conexión se bloqueará por hilo ... – user1658192

+0

No encuentro ningún método en 'Conexión' o 'Declaración' está sincronizado en JDBC. –

+0

Entonces, ¿no hay problema usando la misma conexión en múltiples hilos, donde cada banda de rodadura ejecutará una consulta diferente? – user1658192

4

Un hilo toma una conexión de la agrupación y hace uso exclusivo de ella hasta que se completa, no comparte la conexión con otras cadenas. Cuando termina, devuelve la conexión al grupo (generalmente la conexión anula el método de cierre para devolverlo al grupo). El beneficio es que las conexiones no tienen que ser recreadas para cada uso. Pero no debe tener múltiples hilos haciendo uso simultáneo de una conexión de base de datos.

+0

Quería evitar crear conexiones por hilo para mejorar la eficiencia. En este momento cada hilo crea su propia conexión. – user1658192

+0

@ user1658192 ¿por qué no llamar a getConnection() desde el origen de datos DBCP en lugar de compartir la instancia de conexión? –

+0

¿Qué pasará cuando llame a getConnection(), mientras que otra conexión ya está utilizando la misma conexión? ¿Creará la encuesta una nueva conexión? – user1658192