sql >> Base de Datos >  >> RDS >> PostgreSQL

JDBC:¿Puedo compartir una conexión en una aplicación de subprocesos múltiples y disfrutar de buenas transacciones?

Sí, en general, debe crear una nueva conexión para cada subproceso. No tiene control sobre cómo el sistema operativo divide la ejecución de subprocesos (a pesar de definir sus propias secciones críticas), por lo que sin darse cuenta podría tener varios subprocesos que intentan enviar datos por esa única tubería.

Tenga en cuenta que lo mismo se aplica a cualquier comunicación de red. Si tuviera dos hilos tratando de compartir un socket con una conexión HTTP, por ejemplo.

  • El subproceso 1 realiza una solicitud
  • El subproceso 2 realiza una solicitud
  • El subproceso 1 lee bytes del socket y, sin saberlo, lee la respuesta de la solicitud del subproceso 2

Si envolvió todas sus transacciones en secciones críticas y, por lo tanto, bloqueó cualquier otro subproceso durante un ciclo completo de inicio/confirmación, entonces podría compartir una conexión de base de datos entre subprocesos. Pero no haría eso ni siquiera entonces, a menos que realmente tenga un conocimiento innato del protocolo JDBC.

Si la mayoría de sus subprocesos tienen una necesidad poco frecuente de conexiones a la base de datos (o ninguna necesidad), es posible que pueda designar un subproceso para que haga el trabajo de su base de datos y hacer que otros subprocesos pongan en cola sus solicitudes en ese único subproceso. Eso reduciría la sobrecarga de tantas conexiones. Pero tendrá que descubrir cómo administrar las conexiones por subproceso en su entorno (o hacer otra pregunta específica sobre eso en StackOverflow).

actualización: 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 separado y poder iniciar y confirmar múltiples transacciones por conexión. Pero los proveedores simplemente no lo admiten.

Del mismo modo, las API estándar independientes del proveedor, como JDBC y ODBC, asumen lo mismo, que el estado de la transacción es simplemente una propiedad del objeto de conexión.