Опитвам се да реализирам обединяване на връзки към база данни. По някаква причина случайно получавам изключения, когато използвам няколко нишки.
Когато имам само един, всичко е наред. Също така поне когато тествам, проблемите се появяват само в началото. Тъй като не съм сигурен какво ги причинява, не мога наистина да съм сигурен, че няма да получат и по-късно.
Използване на 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 споделяне на мутационно състояние, като работите с него в обекти, достъпни само чрез локални препратки в рамките на методи (достъпът до които по своята същност е еднопоточен).