gpt4 book ai didi

java - DataSource 配置以排除 REQUIRES_NEW 方法上的死锁

转载 作者:行者123 更新时间:2023-11-30 07:20:45 26 4
gpt4 key购买 nike

同时对基于 JPADAO 层进行压力测试(同时运行 500 个同时更新,每个更新都在一个单独的线程中)。我遇到了以下-系统一直卡住无法取得任何进展。

问题是,在某个时候任何线程都没有可用的连接,因此任何正在运行的线程都无法取得任何进展。

我对此进行了一段时间的调查,根源是在我的一个 JPA DAO 中的 add 方法上的 REQUIRES_NEW 注释。

所以场景是:

  1. 测试开始从 ConnectionPool 获取新的 Connection 以开始事务。
  2. 在一些初始阶段之后,我在我的 DAO 上调用了 add,导致它从 ConnectionPool 请求另一个 Connection > 没有,因为那时所有的 Connections 都是由并行运行的测试获取的。

我尝试使用 DataSource 配置

  1. c3p0 卡住了
  2. DBCP 卡住了
  3. BoneCP 卡住了
  4. MySQLDataSource 某些请求失败,出现错误 - 超出允许的连接数。

虽然我通过读取 REQUIRES_NEW 解决了这个问题,所有数据源都可以完美地工作,但最好的结果似乎仍然是 MySQLDataSource,因为它没有卡住,只是失败了:)

因此,如果您期望高吞吐量,您似乎根本不应该使用 REQUIRES_NEW。

还有我的问题:

是否有可以防止此 REQUIRES_NEW 问题的任一 DataSources 的配置?


我在 c3p0 中使用了 checkout timeout,测试开始失败,正如预期的那样。

  • 2 秒 - 8% 已通过
  • 4 秒 - 12% 通过
  • 6 秒 - 16% 通过
  • 8 秒 - 26% 通过
  • 10 秒 - 34% 通过
  • 12 秒 - 36% 通过
  • 14/16/18 秒 - 40% 通过

这当然是非常主观的。

具有普通配置的 MySQLDataSource 给出了 20% 的通过测试。

最佳答案

如何配置获取连接的超时时间?如果在 2 秒内无法获得连接,池将中止并抛出异常。

另请注意,REQUIRES 更为典型。通常,您希望调用链共享一个事务,而不是为链中的每个新调用启动一个新事务。

关于java - DataSource 配置以排除 REQUIRES_NEW 方法上的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791322/

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