【问题标题】:Hibernate session vs Thread safety休眠会话与线程安全
【发布时间】:2016-08-07 14:16:53
【问题描述】:

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

【问题讨论】:

    标签: java hibernate session orm synchronization


    【解决方案1】:

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

    例子:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      我建议您改为研究乐观锁定。

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

      这种方法可以很好地扩展,因为共享资源(数据库)不再阻塞针对同一行的并发操作。它还允许对表进行几乎无限的操作,而不会发生锁并发争用。相反,锁定被委托给维护这个@Version 注释字段的持久性提供者,并且可以确定自持久性提供者上次查询该行以来该行是否已更改。

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

      【讨论】:

        猜你喜欢
        • 2013-12-07
        • 2015-04-11
        • 2012-05-29
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 2012-06-29
        相关资源
        最近更新 更多