繁体   English   中英

休眠会话线程安全

[英]Hibernate session thread safety

我知道会话不是线程安全的。 我的第一个问题:将实体传递给另一个线程,对它做一些工作,然后将其传递回原始线程并进行更新,是否安全?

public class Example1 {
    MyDao dao;
    ...
    public void doWork() {
        MyEntity entity = dao.getEntity();
        Runnable job = new Job(entity);
        Thread t = new Thread(job);
        t.run();
        t.join();
        dao.merge(entity);
    }

}

我的第二个问题:在一个线程中创建一个实体并将其保存在另一个线程中是否安全?

public class Example2 {
    MyDao dao;
    ...
    public void doWork() {
        MyEntity entity = new Entity();
        new Thread(new Job(dao, entity)).run();
    }
}

public class Job implements Runnable {
    private MyDao dao;
    private MyEntity entity;
    ...
    @Override
    public void run() {
        dao.save(entity);
    }
}

编辑我忘了提到实体是为快速加载而专门配置的

  1. 否。该实体已附加到会话中,并包含链接到该会话的代理(以延迟自身加载)。 因此,这样做将使用多个线程中的会话。 由于会话不是线程安全的,所以这不是一个好主意。

  2. 虽然实体是临时的(即,您刚刚用新创建的实体),但它没有附加到会话中,Hibernate不知道它,并且该实体是一个普通的旧Java对象。 因此,这样做没问题。我没有您DAO的所有详细信息。 如果应该将DAO的方法作为现有事务的一部分来调用,则该方法将不起作用,因为该事务已绑定到当前线程。

暂无
暂无

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

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