【发布时间】:2012-12-09 20:11:45
【问题描述】:
在对基于DAO 的JPA 层进行压力测试时(在单独的线程中同时运行500 个同时更新)。我遇到了以下问题 - 系统总是卡住无法取得任何进展。
问题是,在某个时间点,任何线程都没有可用的连接,因此没有正在运行的线程可以取得任何进展。
我对此进行了一段时间的调查,根源是我的JPA DAO's 之一中add 方法上的REQUIRES_NEW 注释。
所以场景是:
- 测试开始从
ConnectionPool获取新的Connection以开始事务。 - 在某个初始阶段之后,我在我的
DAO上调用add,导致它从ConnectionPool请求另一个Connection,但没有,因为到那时所有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% 的通过测试。
【问题讨论】:
标签: java jpa transactions datasource stress-testing