/ / Como resolver problemas de simultaneidade c3p0? - java, mariadb, c3p0

Como resolver problemas de simultaneidade c3p0? - java, mariadb, c3p0

Estou tentando implementar o pool de conexão de banco de dados. Por algum motivo, recebo exceções aleatoriamente quando uso vários threads.

Quando eu só tenho um, está tudo bem. Além disso, pelo menos quando estou testando, os problemas aparecem apenas no início. Como não tenho certeza do que os causa, não posso realmente ter certeza de que não acontecerão mais tarde também.

Usando c3p0 versão 0.9.5.2

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

Este teste tem 3 threads executando uma consulta simples 1000 vezes cada. Eu reduzo a produção, pois não há exceções mais tarde.

Mensagens de erro para versão tl; dr:

  • Você não pode operar em uma declaração fechada !!!
  • Você não pode operar em uma conexão fechada !!!

Não me incomodarei em carregar todo o projeto, já que o DB está configurado separadamente. No entanto, você pode ver o código de todas as minhas classes aqui:

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

Pool conf https://pastebin.com/wtbw1X5v

Controller https://pastebin.com/BvPh0guY

Como o c3p0 parece uma biblioteca decente imho, acho que estou fazendo algo errado aqui. Alguma dica, por favor?

Respostas:

0 para resposta № 1

Então, você precisa pensar um pouco sobre comoa codificação multithread funciona, porque muitas vezes se deve preferir objetos acessíveis apenas em escopos locais para instâncias ou variáveis ​​de membro estáticas, e quando se deve sincronizar para acesso seguro de objetos que devem ser compartilhados entre Threads.

Seu problema mais básico é o fato de que MariaController.connection é uma variável de membro estático, quando deveria ser inteiramente local para isPlayerSuspended(...).

Você também deve marcar o estático MariaConnectionPool.getInstance() método synchronized [o que equivale a envolver o corpo do bacalhau com synchronized( MariaConnectionPool.class ){ ... } ].

Pode haver outros problemas também. Escrever código multithread requer que você pense cuidadosamente sobre o que pode ser compartilhado e quando, e frequentemente a resposta é eitar o compartilhamento de estado mutável trabalhando com ele em objetos acessíveis apenas por meio de referências locais dentro de métodos (o acesso é inerentemente single-threaded).