gpt4 book ai didi

java - Hibernate session 线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:20 24 4
gpt4 key购买 nike

我知道 session 不是线程安全的。我的第一个问题:将一个实体传递给另一个线程是否安全,对其进行一些处理,然后将其传递回原始线程并进行更新。

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. 没有。该实体附加到 session 并包含链接到 session 的代理(以便延迟加载它们自己)。这样做会因此使用来自多个线程的 session 。由于 session 不是线程安全的,因此这不是一个好主意。

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

关于java - Hibernate session 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com