JPA
在对我的基础层进行压力测试DAO
时(在单独的线程中同时运行 500 个同时更新)。我遇到以下问题 - 系统总是卡住无法取得任何进展。
问题是,在某个时候任何线程都没有可用的连接,所以没有运行线程可以取得任何进展。
我已经对此进行了一段时间的调查,根源是REQUIRES_NEW
我add
的一个JPA DAO's
.
所以场景是:
- 测试开始获取新
Connection
的从ConnectionPool
开始事务。 - 在某个初始阶段之后,我调用
add
myDAO
,导致它请求另一个没有的,因为到那时,所有这些Connection
都是由并行运行的测试进行的。ConnectionPool
Connections
我尝试使用 DataSource 配置
c3p0
卡住DBCP
卡住BoneCP
卡住MySQLDataSource
使某些请求失败,并出现错误 - 超出允许的连接数。
虽然我通过阅读 REQUIRES_NEW 解决了这个问题,所有数据源都可以完美地工作,但最好的结果似乎仍然是 MySQLDataSource,因为它没有卡住而只是失败了:)
因此,如果您期望高吞吐量,您似乎根本不应该使用 REQUIRES_NEW。
我的问题:
是否有任何数据源的配置可以防止这个 REQUIRES_NEW 问题?
我在 c3p0 中使用了结帐超时,并且测试开始失败,正如预期的那样。
- 2 秒 - 8 % 通过
- 4 秒 - 12 % 通过
- 6 秒 - 16 % 通过
- 8 秒 - 26 % 通过
- 10 秒 - 34 % 通过
- 12 秒 - 36 % 通过
- 14/16/18 秒 - 40 % 通过
这当然是非常主观的。
具有简单配置的 MySQLDataSource 提供了 20% 的通过测试。