PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

JDBC :Puis-je partager une connexion dans une application multithreading et profiter de transactions intéressantes ?

Oui, en général, vous devez créer une nouvelle connexion pour chaque thread. Vous n'avez aucun contrôle sur la façon dont le système d'exploitation répartit l'exécution des threads (en dépit de la définition de vos propres sections critiques), vous pourriez donc avoir par inadvertance plusieurs threads essayant d'envoyer des données dans ce seul canal.

Notez qu'il en va de même pour toutes les communications réseau. Si vous aviez deux threads essayant de partager un socket avec une connexion HTTP, par exemple.

  • Le fil 1 effectue une requête
  • Le fil 2 effectue une requête
  • Le thread 1 lit les octets du socket, lisant involontairement la réponse de la requête du thread 2

Si vous avez enveloppé toutes vos transactions dans des sections critiques, et donc verrouillé tous les autres threads pendant un cycle complet de début/validation, vous pourrez peut-être partager une connexion de base de données entre les threads. Mais je ne ferais pas ça même alors, à moins que vous n'ayez vraiment une connaissance innée du protocole JDBC.

Si la plupart de vos threads ont un besoin peu fréquent de connexions à la base de données (ou pas du tout), vous pourrez peut-être désigner un thread pour effectuer votre travail de base de données et faire en sorte que d'autres threads mettent leurs requêtes en file d'attente sur ce thread. Cela réduirait les frais généraux de tant de connexions. Mais vous devrez trouver comment gérer les connexions par thread dans votre environnement (ou poser une autre question spécifique à ce sujet sur StackOverflow).

mise à jour : Pour répondre à votre question dans le commentaire, la plupart des marques de bases de données ne prennent pas en charge plusieurs transactions simultanées sur une seule connexion (InterBase/Firebird est la seule exception que je connaisse).

Ce serait bien d'avoir un objet de transaction séparé et de pouvoir démarrer et valider plusieurs transactions par connexion. Mais les fournisseurs ne le supportent tout simplement pas.

De même, les API standard indépendantes du fournisseur telles que JDBC et ODBC font la même hypothèse, à savoir que l'état de la transaction est simplement une propriété de l'objet de connexion.