/ / Comment résoudre les problèmes de concurrence c3p0? - java, mariadb, c3p0

Comment résoudre les problèmes de simultanéité c3p0? - java, mariadb, c3p0

J'essaye d'implémenter le pool de connexions de base de données. Pour une raison quelconque, j'obtiens des exceptions au hasard lorsque j'utilise plusieurs threads.

Quand je n'en ai qu'un, tout va bien. Aussi au moins lorsque je teste, les problèmes n'apparaissent qu'au début. Comme je ne suis pas sûr de ce qui les cause, je ne peux pas vraiment être sûr qu'ils ne se produiront pas plus tard également.

Utilisation de la version 0.9.5.2 de c3p0

Example output from my test: https://pastebin.com/NrcR6mhz

Ce test comporte 3 threads exécutant une requête simple 1000 fois chacun. J'ai réduit la sortie, car il n'y a pas d'exceptions plus tard.

Messages d'erreur pour la version tl; dr:

  • Vous ne pouvez pas opérer sur une déclaration fermée !!!
  • Vous ne pouvez pas opérer sur une connexion fermée !!!

Je n'ai pas pris la peine de télécharger tout le projet, car DB est configuré séparément. Cependant, vous pouvez voir le code de toutes mes classes ici:

Main - https://pastebin.com/1Rgjr8H5

Pool conf https://pastebin.com/wtbw1X5v

Controller https://pastebin.com/BvPh0guY

Comme le c3p0 semble bibliothèque décente à mon humble avis, je suppose que je fais quelque chose de mal ici. Des conseils s'il vous plaît?

Réponses:

0 pour la réponse № 1

Alors, vous devez réfléchir un peu à la façon dontle codage multithread fonctionne, pourquoi on devrait souvent préférer les objets accessibles uniquement dans les étendues locales aux variables d'instance ou de membre statiques, et quand on devrait synchroniser pour un accès sécurisé aux objets qui doivent être partagés entre les threads.

Votre problème le plus fondamental est le fait que MariaController.connection est une variable membre statique, alors qu'elle doit être entièrement locale à isPlayerSuspended(...).

Vous devez également marquer la statique MariaConnectionPool.getInstance() méthode synchronized [ce qui équivaut à entourer le corps de la morue avec synchronized( MariaConnectionPool.class ){ ... } ].

Il peut également y avoir d'autres problèmes. L'écriture de code multithread nécessite que vous réfléchissiez soigneusement à ce qui peut être partagé et quand, et souvent la réponse est d'éviter le partage de l'état mutable en travaillant avec lui dans des objets accessibles uniquement via des références locales dans des méthodes (dont l'accès est intrinsèquement monothread).