【发布时间】:2017-03-26 11:59:07
【问题描述】:
我的旧应用程序遵循链来查询我的数据库:Spring Tx -> Hibernate -> C3P0。现在我需要在现有架构的基础上实现新功能。
我通常通过使用@Transactional 注释或手动调用PlatformTransactionManager 来输入事务上下文。
有时,为了执行异步和大数据操作,我使用SessionFactory API 打开一个无状态会话。我们的线程池控制得很好,我们从来没有遇到任何额外的问题
第一次,我的要求是并行执行多个数据库操作以加快性能。我对此表示怀疑,因为我对多线程操作非常小心。
对于数据库中的每个实体,我可以在单独的线程上执行协调操作。但是每个协调操作对它产生的两个线程中的每一个都使用一对连接。所以基本上每个线程有4个连接。
多线程课教导学生为了防止死锁(吃哲学家问题),资源应该以事务的方式获取:一旦你获得了一个fork,如果你不能在合理的时间内获得第二个,释放第一个然后再试一次。
我的问题很简单。鉴于SessionFactory API,如果池已满,我如何编写不会无限期等待来自 c3p0 的 4 个连接的代码?我的意思是我需要 4 个StatelessSessions,只有在有 4 个空间的情况下,否则我可以等待并重试。
据我所知,SessionFactory API 处于阻塞状态,不允许设置看门狗
【问题讨论】:
标签: java multithreading hibernate dining-philosopher