首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate资源池关闭得太快

Hibernate资源池关闭得太快
EN

Stack Overflow用户
提问于 2013-02-19 05:52:57
回答 1查看 3.2K关注 0票数 2

我正在对我们的数据库执行压力测试,该数据库是MySQL上的hibernate。除了maxpoolsize为15之外,我使用默认配置的c3p0连接池。

代码语言:javascript
复制
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个实体,然后我会收到以下三条日志消息之一:

错误14:39:23,127Thread-20 SqlExceptionHelper -由以下故障引起的SQLException : com.mchange.v2.resourcepool.ResourcePoolException:尝试使用关闭或损坏的资源池

信息14:48:45,478线程-11 JdbcTransaction - HHH000425:无法关闭会话;在事务完成时吞咽exception[org.hibernate.service.UnknownServiceException:未知服务请求的[ org.hibernate.stat.spi.StatisticsImplementor]

INFO 14:49:22,860Thread-18 BasicResourcePool - com.mchange.v2.resourcepool.BasicResourcePool@16f7ca --签出资源的尝试被中断,因为池现在已关闭。线程:线程18

我被什么原因弄糊涂了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-02 13:23:00

您有一个竞态条件;这就是导致关闭连接池错误的原因。

在您的测试方法中,您正在创建异步使用您的连接池的新线程,但是测试方法本身并不等待它们完成。因此,有可能(我猜测100个线程很有可能),其中一些线程在测试方法完成时还没有完成。在您的测试方法完成后,Spring将关闭连接池,因此当线程随后尝试使用连接池时,它将出错。

如果您为记录器org.springframework打开了DEBUG (或可能是TRACE)日志记录,并将一条日志语句添加到您的addEntity(...)方法中,那么您应该会看到在测试方法完成并且发生了连接池bean销毁之后,它会被调用。

要解决此问题,请使用CountDownLatch让main测试方法等待线程完成工作后再返回:

代码语言:javascript
复制
@Test
public void entityStressTest() {
    int numThreads = 100;
    final CountDownLatch counter = new CountDownLatch(numThreads);
    for(int i = 0; i < numThreads; i++) {
        Thread t = new Thread(new Runnable() {
            public void run() {
                rs.addEntity(new Entity());
                counter.countDown();
            }
        }
        t.start();
    }
    counter.await();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14945970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档