如何解决c3p0并发问题?
How to solve c3p0 concurrency issues?
我正在尝试实施数据库连接池。由于某些原因,我在使用多线程时随机出现异常。
当我只有一个时,一切都很好。另外至少在我测试时,问题只出现在开始时。由于我不确定是什么导致了它们,所以我真的不能确定它们以后不会发生。
使用 c3p0 版本 0.9.5.2
Example output from my test: https://pastebin.com/NrcR6mhz
这个测试有 3 个线程 运行 每个简单查询 1000 次。我把输出缩短了,因为以后没有例外。
tl;dr 版本的错误消息:
- 您不能对已关闭的语句进行操作!!!
- 您不能在关闭的连接上操作!!!
我不会费心上传整个项目,因为数据库是单独配置的。不过,你可以在这里看到我所有的类的代码:
Main - https://pastebin.com/1Rgjr8H5
Pool conf https://pastebin.com/wtbw1X5v
Controller https://pastebin.com/BvPh0guY
由于 c3p0 看起来不错,恕我直言,我想我在这里做错了什么。请问有什么建议吗?
因此,您需要稍微考虑一下多线程编码的工作原理,为什么人们通常应该更喜欢只能在局部范围内访问的对象而不是实例或静态成员变量,以及何时应该同步以安全访问必须是在线程之间共享。
你最基本的问题是 MariaController.connection
是一个静态成员变量,而它应该完全是 isPlayerSuspended(...)
的局部变量。
您还应该标记静态 MariaConnectionPool.getInstance()
方法 synchronized
[这相当于用 synchronized( MariaConnectionPool.class ){ ... }
包围鳕鱼的主体]。
可能还有其他问题。编写多线程代码需要您仔细考虑可以共享的内容和时间,通常答案是通过在只能通过方法内的本地引用访问的对象中使用可变状态来避免共享可变状态(访问本质上是 single-threaded ).
我正在尝试实施数据库连接池。由于某些原因,我在使用多线程时随机出现异常。
当我只有一个时,一切都很好。另外至少在我测试时,问题只出现在开始时。由于我不确定是什么导致了它们,所以我真的不能确定它们以后不会发生。
使用 c3p0 版本 0.9.5.2
Example output from my test: https://pastebin.com/NrcR6mhz
这个测试有 3 个线程 运行 每个简单查询 1000 次。我把输出缩短了,因为以后没有例外。
tl;dr 版本的错误消息:
- 您不能对已关闭的语句进行操作!!!
- 您不能在关闭的连接上操作!!!
我不会费心上传整个项目,因为数据库是单独配置的。不过,你可以在这里看到我所有的类的代码:
Main - https://pastebin.com/1Rgjr8H5
Pool conf https://pastebin.com/wtbw1X5v
Controller https://pastebin.com/BvPh0guY
由于 c3p0 看起来不错,恕我直言,我想我在这里做错了什么。请问有什么建议吗?
因此,您需要稍微考虑一下多线程编码的工作原理,为什么人们通常应该更喜欢只能在局部范围内访问的对象而不是实例或静态成员变量,以及何时应该同步以安全访问必须是在线程之间共享。
你最基本的问题是 MariaController.connection
是一个静态成员变量,而它应该完全是 isPlayerSuspended(...)
的局部变量。
您还应该标记静态 MariaConnectionPool.getInstance()
方法 synchronized
[这相当于用 synchronized( MariaConnectionPool.class ){ ... }
包围鳕鱼的主体]。
可能还有其他问题。编写多线程代码需要您仔细考虑可以共享的内容和时间,通常答案是通过在只能通过方法内的本地引用访问的对象中使用可变状态来避免共享可变状态(访问本质上是 single-threaded ).