Hibernate会话与线程安全

时间:2016-08-07 14:16:54

标签: java hibernate session orm synchronization

如何在使用休眠会话时获得线程安全性。在多线程环境中使用会话对数据库执行CRUD操作时,我经常遇到数据库和会话不同步的异常.Mine是一个多线程应用程序,它试图锁定一个对象(进入锁表)另一个用户使用特定的时间跨度然后释放锁(从锁表中删除条目)。我可以使CRUD方法同步吗?如果我可以在多线程环境中执行应用程序时可以产生什么影响。

2 个答案:

答案 0 :(得分:0)

建议的方法是按请求创建会话并关闭它。不太确定如何设置配置,但如果你看一下hibernate开发人员指南或文档,它会指导你。

示例:

Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
sess.beginTransaction();

//您的数据库操作将在此处执行。

sess.update(profile);

sess.getTransaction().commit();
sess.close();

答案 1 :(得分:0)

我想补充一点,我鼓励你使用不同的锁定策略。

当需要高并发性时,行级锁定不能很好地扩展。如果请求的行级锁定太多,大多数数据库平台最终会将行级锁升级为页面或更糟糕的表级锁。这将对性能,并发性和可伸缩性产生巨大影响。

我建议你改为考虑乐观锁定。

乐观锁定避免了将锁推送到数据库,而是允许持久性提供程序维持此状态。这是通过提供@Version带注释的字段来完成的,该字段包含唯一标识行的版本化状态的种子值。

这种方法可以很好地扩展,因为共享资源(数据库)不再阻止针对同一行的并发操作。它还允许在没有锁并发争用的情况下对表进行实际上无限制的操作。相反,锁定被委托给持久性提供程序,该持久性提供程序维护此@Version带注释的字段,并且可以确定自上次持久性提供程序查询该行以来该行是否已更改。

简而言之,第一个使用乐观锁定更新行的人获胜,基于第一次更新之前的版本状态的所有后续更新都将失败并显示OptimisticLockException。然后由您的代码决定如何重试操作或选择让用户重新开始。