java - 具有 UserThread 和序列化的线程中的 Hibernate session

标签 java hibernate concurrency

我有以下情况: 我有一个线程使用 session 来保存或更新

public void run()
{
    Session session = DAO.getInstance().getCurrentSession();
    Transaction tx = null;
        try
    {

        tx = session.beginTransaction();
        session.saveOrUpdate(entity);
             }catch.....
     }

但与此同时,在使用 session.saveorUpdate 进行序列化期间,我更改了实体对象... 因此用户线程将在 session 序列化期间更改数据..

如何克服这个问题? hibernate 有没有简单的方法?

编辑: 最大的问题在于 UserThread 在 saveOrUpdate 方法期间更改实体对象中的某些数据。

最佳答案

听起来您对使用版本控制的乐观并发控制感兴趣。

乐观并发控制

如果您以前没有遇到过它,它与比较和交换类似,Hibernate 将管理版本和实体。通过在更新期间增加版本号并检查之后版本号是否未更改,Hibernate 可以检测冲突和错误。它乐观地假设实际争用很少见,并将其留给开发人员来处理异常。我通常发现情况确实如此,正如 Hibernate 文档所说;

The only approach that is consistent with high concurrency and high scalability, is optimistic concurrency control with versioning.

您可以调整 Hibernate 的事务可见性和隔离级别以影响更详细的细节,请参阅

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic

交易划分

我无法从问题的代码片段中看出,但也可能值得考虑事务边界。通常,我会在业务操作或请求开始时启动事务 (beginTransaction),然后提交和完成。所有更新均在此 session (Hibernate 每个 session 一个线程)模型中执行。我仍然在自己的线程上处理每个业务操作或请求,并依靠通常的 Hiernate 隔离级别等来管理冲突。

我提到它是因为可能有机会退一步思考为什么要从多个线程进行更新。您的应用程序可能不适合我试图概述的方法,但如果可以移动它以避免真正的多线程更新,可能值得考虑。

如果生产中可能存在频繁的冲突,那么这当然值得理解。对此进行测试可以帮助您了解是否确实需要担心它,或者是否可以依靠通常的事务控制来检测冲突并以其他方式处理它们。

关于java - 具有 UserThread 和序列化的线程中的 Hibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9566695/

相关文章:

java - Android:从文本文件中读取 double 并将它们放入数组中

java 8 流对类别中的第一个项目执行 Operation1,然后对类别中的所有项目执行 Operation2

Linux ext3 readdir 和并发更新

java - 类初始化和同步类方法

python - 在python中同时调用一个api

java - 如何将 Comet 与 Spring MVC 一起使用?

java - 尝试将 if-else 语句转换为 switch 语句,但最终出现错误

Hibernate hql - 帮助查询外键

java - 系统数据库用户共享的 Hibernate Session 工厂

java - hibernate :MySQL