Sí, en general, necesita crear una nueva conexión para cada hilo. Usted no tiene control sobre cómo el sistema operativo veces la ejecución de los hilos (a pesar de definir sus propias secciones críticas), por lo que podría tener varios subprocesos tratando de enviar datos por ese conducto.
Tenga en cuenta lo mismo se aplica a las comunicaciones de red. Si tuviera dos hilos tratando de compartir un socket con una conexión HTTP, por ejemplo.
- Tema 1 hace una petición
- Tema 2 hace una petición
- Tema 1 lee bytes de la toma, sin saberlo, la lectura de la respuesta a partir de hilos de 2 petición
Si envuelto todas sus transacciones en secciones críticas y, por lo tanto, bloquear cualquier otro subproceso para un ciclo completo de inicio/confirmación, entonces es posible que pueda compartir una conexión de base de datos entre subprocesos. Pero no lo haría incluso entonces, a menos que realmente tenga un conocimiento innato del protocolo JDBC.
Si la mayoría de sus subprocesos tienen poca necesidad de conexiones a la base de datos (o ninguna), puede designar un subproceso para hacer su trabajo de base de datos, y tener otros subprocesos en cola para un solo subproceso. Eso reduciría la sobrecarga de tantas conexiones. Pero tendrá que descubrir cómo administrar las conexiones por hilo en su entorno (o hacer otra pregunta específica sobre eso en StackOverflow).
update: Para responder a su pregunta en el comentario, la mayoría de las marcas de bases de datos no admiten múltiples transacciones simultáneas en una sola conexión (InterBase/Firebird es la única excepción que conozco).
Sería bueno tener un objeto de transacción por separado, y poder iniciar y confirmar transacciones múltiples por conexión. Pero los proveedores simplemente no lo admiten.
Del mismo modo, API estándar independientes del proveedor como JDBC y ODBC hacen la misma suposición, que el estado de la transacción es simplemente una propiedad del objeto de conexión.
Ok ... Solo por curiosidad, ¿tienes una idea de por qué la definición de la transacción es eso junto con la definición de conexión en JDBC? Realmente apreciaría un objeto de transacción. – fulmicoton
¡Muchas gracias por su respuesta! – fulmicoton
La afirmación "podría inadvertidamente tener varios subprocesos intentando enviar datos por ese conducto" en esta respuesta es definitivamente incorrecta para postgresql. Ver http://doc.postgresintl.com/jdbc/ch10.html. La conexión es al menos segura para subprocesos, aunque no completamente paralelizada como podría ser. –