gpt4 book ai didi

java - 在 Hibernate/C3P0 中处理连接池耗尽并避免死锁

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:21 27 4
gpt4 key购买 nike

我的旧应用程序按照链查询我的数据库:Spring Tx -> Hibernate -> C3P0 。现在我需要在现有架构的基础上实现新的功能。

我通常使用 @Transactional 输入事务上下文注释或手动调用 PlatformTransactionManager .

有时,为了执行异步和大数据操作,我使用SessionFactory打开无状态 session 。 API。我们从未遇到任何其他问题,因为我们的线程池得到了很好的控制

第一次,我的要求是并行执行多个数据库操作以提高性能。我对此表示怀疑,因为我对多线程操作非常小心。

对于数据库中的每个实体,我可以在单独的线程上执行协调操作。但每个协调操作为其生成的两个线程中的每一个都使用一对连接。所以每个线程基本上有 4 个连接。

多线程类(class)告诉学生,为了防止死锁(吃掉哲学家的问题),应该以事务方式获取资源:一旦你获取了一个 fork ,如果你无法在合理的时间内获取第二个 fork ,请释放第一个并重试。

我的问题很简单。鉴于 SessionFactory API,如果池已满,我如何编写不会无限期等待来自 c3p0 的 4 个连接的代码?我的意思是我需要 4 StatelessSession仅当有 4 个空间时才进行,否则我可以等待并重试。

据我所知,SessionFactory API 处于阻塞状态,不允许设置看门狗

最佳答案

目前的想法是使用简单的旧解决方法。

一般来说,在 Java 世界中,如果 API 不提供用于获取资源的看门狗方法,您可以将其委托(delegate)给 Future,Future 提供 get(int timeout, TimeUnit timeUnit) API 来约束执行。

第1步:用于资源获取的看门狗定时器

那么基本上,如何在超时范围内获得无状态 session ?

private Future<StatelessSession> getStatelessSession(SessionFactory sessionFactory)
{
return asyncTaskExecutor.submit(new Callable<StatelessSession>()
{

@Override
public StatelessSession call() throws Exception
{
return sessionFactory.openStatelessSession();
}
});
}

try {
StatelessSession session = getStatelessSession(sessionFactory).get(3000,TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
// go to step 2
}

第 2 步:像哲学家一样吃饭

正如我所说,我的问题看起来基本上就像哲学家就餐一样,只不过我们不仅有两把 fork ,还有总共 4 个勺子和刀子。

StatelessSession session1, session2, session3, session4;
for (int i=0; i<MAX_ATTEMPTS;i++) {
try {
session1 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
continue;
}
try {
session2 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session1.close();
continue;
}
try {
session3 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session2.close();
session1.close();
continue;
}
try {
session4 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session3.close();
session2.close();
session1.close();
continue;
}
}

如果超出 MAX_ATTEMPTS 会发生什么,这取决于您,开发者!

关于java - 在 Hibernate/C3P0 中处理连接池耗尽并避免死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561792/

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