繁体   English   中英

休眠会话与线程安全

[英]Hibernate session vs Thread safety

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

推荐的方法是为每个请求创建会话并关闭它。 不太确定如何设置配置,但是如果您查看hibernate开发人员指南或文档,它将为您提供指导。

例:

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

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

sess.update(profile);

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

我确实想补充一点,我鼓励您使用其他锁定策略。

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

相反,我建议您改为考虑乐观锁定。

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

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

简而言之,第一个使用Optimistic Locking更新行的人会获胜,所有基于第一个更新之前的版本状态的后续更新都将失败,并出现OptimisticLockException 然后由您的代码决定如何重试该操作或选择要求用户重新开始操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM