Hibernate会话线程安全

时间:2013-11-22 16:46:53

标签: java multithreading hibernate

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

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 个答案:

答案 0 :(得分:6)

  1. 没有。实体附加到会话并包含链接到会话的代理(为了自己延迟加载)。这样做会使用来自多个线程的会话。由于会话不是线程安全的,因此这不是一个好主意。

  2. 虽然实体是瞬态的(即你刚刚用new创建它),但它没有附加到会话,Hibernate不知道它,并且实体是一个普通的旧Java对象。所以没问题。虽然我没有DAO的所有细节。如果您的DAO方法应该作为现有事务的一部分被调用,那么这将无效,因为事务与当前线程相关联。