web-dev-qa-db-fra.com

Le thread Java.sql.Connection est-il sûr?

Pour reformuler la question: dois-je éviter de partager des instances de classes qui implémentent Java.sql.Connection entre différents threads?

60
Boris Pavlović

Si le pilote JDBC est conforme aux spécifications, alors techniquement oui, l'objet est thread-safe, mais vous devez éviter de partager les connexions entre les threads, car l'activité sur la connexion signifie qu'un seul thread sera capable de faire quoi que ce soit à la fois .

Vous devez utiliser un pool de connexions (comme Apache Commons DBCP ) pour vous assurer que chaque thread obtient sa propre connexion.

65
skaffman

Java.sql.Connection est une interface. Tout dépend donc de l'implémentation du pilote, mais en général, vous devez éviter de partager la même connexion entre différents threads et utiliser des pools de connexions. Il est également conseillé d'avoir un nombre de connexions dans le pool supérieur au nombre de threads de travail.

11
Andrey Adamovich

C'est plutôt un vieux fil de discussion, mais pour ceux qui recherchent une réponse concernant Microsoft SQL Server, voici la réponse:

SQLServerConnection n'est pas sûr pour les threads, mais plusieurs instructions créées à partir d'une seule connexion peuvent être traitées simultanément dans des threads simultanés.

et

SQLServerConnection implémente une connexion JDBC à SQL Server.

De tout ce qui précède, vous pouvez partager des instructions mais pas des connexions, et si vous avez besoin d'une connexion dans chaque thread, vous pouvez utiliser un pool de threads.

En savoir plus ici

4
Hanash Yaslem

Oracle JDBC et multithreading docs:

Étant donné que toutes les méthodes de l'API JDBC Oracle sont synchronisées, si deux threads tentent d'utiliser simultanément l'objet de connexion, l'un sera forcé d'attendre que l'autre termine son utilisation.

Il peut donc être sûr dans le cas d'Oracle, mais l'accès simultané souffrirait d'un goulot d'étranglement.

2
Vadzim

Nous avons eu ArrayOutOfBoundsException sur le cache d'instructions Websphere de son pooleddatasource, et nous avons dû désactiver ce cache.

Nous avons eu un traitement qui se bloquait.

Tout cela en raison de l'accès actuel à la connexion, donc la conclusion par la pratique de la vie réelle, est que vous ne devez pas faire cela.

1
Mirak