当前位置:  开发笔记 > 编程语言 > 正文

在C3p0中锁定订购

如何解决《在C3p0中锁定订购》经验,为你挑选了0个好方法。

我试图使用c3p0在我们的应用程序中记录数据库连接的创建和销毁ConnectionCustomizer.在其中,我有一些看起来像这样的代码:

log(C3P0Registry.getPooledDataSources())

我遇到了僵局.我发现c3p0在其库中至少有几个使用synchronized方法的对象,并且似乎没有指定它们的预期锁定顺序.当我记录连接时,我正在锁定C3P0Registry并最终PoolBackedDataSource(简单地创建数据源列表正在访问导致锁定的哈希码).

关闭连接提供程序(调用C3P0ConnectionProvider.close())会导致以相反的顺序调用锁.但是当子数据源被关闭时,我的日志记录正在被触发.结果是僵局.

看起来我在c3p0库中进行的调用都是有效的,预期的调用:

C3P0ConnectionProvider.close()

C3P0Registry.getPooledDataSources()

它似乎(除非在文档中明确说明)它应该是图书馆管理它自己的锁定策略的责任.(我不是说责怪任何人......只是为了确认我对最佳实践的理解)

我该如何处理这个问题?由于c3p0使用的是同步方法而不是更现代的机制,我无法真正测试锁.

从我的DataSource结束代码,我可以先C3P0Registry关闭锁定,然后关闭DataSource.我会猜测正确的锁定顺序,我不知道我是否觉得舒服.

我不认为我可以反转日志记录调用的锁定顺序.我需要C3P0Registry获取列表DataSources,所以我无法锁定DataSources没有先锁定C3P0Registry以获取它们的引用.

另一种解决方案当然是在c3p0的所有内容之上提供另一个更高级别的锁定.在连接池的情况下,这似乎打败了这一点.

现在,我正在回滚我的伐木.谢谢你的帮助.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有