Flo*_*oky 10 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的第二个问题:在一个线程中新建一个实体并将其保存在另一个线程中是否安全?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑我忘了提到实体是专门为急切加载配置的
不是.实体附加到会话并包含链接到会话的代理(为了自己延迟加载).这样做会使用来自多个线程的会话.由于会话不是线程安全的,因此这不是一个好主意.
虽然实体是瞬态的(即你刚刚用new创建它),但它没有附加到会话,Hibernate不知道它,并且实体是一个普通的旧Java对象.所以没问题.虽然我没有DAO的所有细节.如果DAO的方法应该作为现有事务的一部分被调用,那么这将无效,因为事务与当前线程相关联.
| 归档时间: |
|
| 查看次数: |
7551 次 |
| 最近记录: |