我正在对我们的数据库执行压力测试,这是MySQL上的休眠模式。我使用的是默认配置c3p0连接除外的15休眠资源池关闭得太快
interface EntityRepository extends JpaRepository<Entity, UUID> {}
@Service
public class EntityService {
@Autowired
EntityRepository er;
@Transactional(propagation = Propagation.REQUIRED)
public Entity addEntity(Entity r) {
er.save(r);
}
}
public class StressTest {
@Autowired
EntityService rs;
@Test
public void entityStressTest() {
for(int i = 0; i < 100; i++) {
Thread t = new Thread(new Runnable() {
public void run() {
rs.addEntity(new Entity());
}
}
t.start();
}
}
}
我每次运行这个测试,我创建5-8实体,然后我收到以下三个日志消息之一maxpoolsize:
[ERROR] 14:39:23127 [线程20] SqlExceptionHelper - 一个SQLEXCEPTION通过以下的故障引起:com.mchange.v2.resourcepool.ResourcePoolException:尝试使用密闭或破碎资源池
[INFO] 14:48:45,478 [Thread-11] JdbcTransaction - HHH000425:无法关闭会话;吞吐异常[org.hibernate.service.UnknownServiceException:未知服务请求[org.hibernate.stat.spi.StatisticsImplementor]]作为事务完成
[INFO] 14:49:22,860 [Thread-18] BasicResourcePool - com。 [email protected] - 尝试检出资源已中断,因为池现在已关闭。 [螺纹:螺纹18]
我难倒,什么可能会导致这
喜。我不知道是什么导致了这个问题,但是在某些情况下,当你不愿意的时候,在底层资源池上调用close()。你在SEVERE级别的日志中是否有与c3p0相关的[package com.mchange.v2.resourcepool]输出?如果由于意外问题导致池内部关闭,则会出现。 (顺便说一句,你使用的是什么版本的c3p0?)否则,你需要追踪哪些外部事物明确地关闭了池。 – 2013-02-19 01:41:00
如果有帮助,我可以想出一个调试版本,在池关闭时记录堆栈跟踪。 (“关闭池”应该是一个非常罕见的事件:连接来来往往,但池通常在其应用程序的完整运行时间内存活。)有关我的电子邮件,请参阅c3p0的文档,http://www.mchange.com/projects/C3P0 / – 2013-02-19 01:41:25