如何解决c3p0并发问题?

时间:2018-02-23 19:36:18

标签: 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,我猜我在这里做错了。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

因此,您需要考虑一下多线程编码的工作原理,为什么通常应该优先选择只能在本地范围内访问的实例或实例或静态成员变量,以及何时应该同步以便安全访问必须在线程。

你最基本的问题是MariaController.connection是一个静态成员变量,它应该完全属于isPlayerSuspended(...)

你还应该标记静态MariaConnectionPool.getInstance()方法synchronized [相当于用synchronized( MariaConnectionPool.class ){ ... }包围鳕鱼体的方法。

也可能存在其他问题。编写多线程代码需要您仔细考虑可共享的内容以及何时共享,并且通常答案是通过在只能通过方法中的本地引用访问的对象中使用它来共享可变状态(访问本身就是单线程)。