/ / Как да решим проблеми с паралелността на c3p0? - java, mariadb, c3p0

Как да решим проблеми с паралелността на c3p0? - java, mariadb, c3p0

Опитвам се да реализирам обединяване на връзки към база данни. По някаква причина случайно получавам изключения, когато използвам няколко нишки.

Когато имам само един, всичко е наред. Също така поне когато тествам, проблемите се появяват само в началото. Тъй като не съм сигурен какво ги причинява, не мога наистина да съм сигурен, че няма да получат и по-късно.

Използване на c3p0 версия 0.9.5.2

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

Този тест има 3 нишки, изпълняващи обикновена заявка за 1000 пъти всяка. Нарязах изхода по-кратко, тъй като по-късно няма изключения.

Съобщения за грешка за tl; dr версия:

  • Не можете да работите в затворено изявление !!!
  • Не можете да работите на затворена връзка !!!

Няма да се притеснявам да кача целия проект, тъй като DB се конфигурира отделно. Можете обаче да видите кода на всичките ми класове тук:

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

Pool conf https://pastebin.com/wtbw1X5v

Controller https://pastebin.com/BvPh0guY

Тъй като c3p0 изглежда приличен библиотека imho, предполагам, че правя нещо нередно тук. Някакви съвети, моля?

Отговори:

0 за отговор № 1

Така че, трябва да помислите малко какмногонишковото кодиране работи, защо човек често трябва да предпочита обекти, достъпни само в локални обхвати, за примерни или статични променливи член и кога трябва да се синхронизира за безопасен достъп до обекти, които трябва да бъдат споделени между нишките.

Вашият най-основен проблем е фактът, че MariaController.connection е статична променлива член, когато тя трябва да бъде изцяло локална isPlayerSuspended(...).

Вие също трябва да маркирате статичното MariaConnectionPool.getInstance() метод synchronized [което е еквивалентно на заобикалянето на тялото на треската synchronized( MariaConnectionPool.class ){ ... } ].

Може да има и други проблеми. Писането на многопоточен код изисква внимателно да помислите какво може да бъде споделено и кога и често отговорът е на aoid споделяне на мутационно състояние, като работите с него в обекти, достъпни само чрез локални препратки в рамките на методи (достъпът до които по своята същност е еднопоточен).