gpt4 book ai didi

java - C3p0 中的锁排序

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:35 26 4
gpt4 key购买 nike

我正在尝试使用 c3p0 的 ConnectionCustomizer 记录我们应用程序中数据库连接的创建和销毁。其中,我有一些代码如下所示:

log(C3P0Registry.getPooledDataSources())

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

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

似乎我对 c3p0 库进行的两次调用都是有效的,预期的调用:

  • C3P0ConnectionProvider.close()
  • C3P0Registry.getPooledDataSources()

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

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

从我的 DataSource 关闭代码中,我可以在关闭 DataSource 之前先获取 C3P0Registry 锁。我会猜测正确的锁定顺序,我不知道我是否愿意接受。

我不认为我可以撤销记录调用的锁定顺序。我需要 C3P0Registry 来获取 DataSources 的列表,所以如果不先锁定 C3P0Registry 我就无法锁定 DataSources > 获取对它们的引用。

当然,另一个解决方案是在所有 c3p0 之上提供另一个更高级别的锁。在连接池的情况下,这似乎没有意义。

现在,我正在回滚我的日志记录。感谢您的帮助。

最佳答案

我不知道如何解决锁定问题,但我认为您应该退后一步,想想最初的问题。“我正在尝试在我们的应用程序中记录数据库连接的创建和销毁......”

我会推荐以下内容。

创建一个类并使其实现javax.sql.DataSource。创建一个相同类型的字段并将所有方法委托(delegate)给它。在 getConnection() 方法中返回您自己的 Connection 类环绕java.sql.Connection 等等。然后将此类包装在您的原始数据源周围。在您的类(class)中,您现在可以简单地创建一个记录器并记录您想要在日志中看到的所有操作。

关于java - C3p0 中的锁排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com