[英]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);
}
}
編輯我忘了提到實體是為快速加載而專門配置的
否。該實體已附加到會話中,並包含鏈接到該會話的代理(以延遲自身加載)。 因此,這樣做將使用多個線程中的會話。 由於會話不是線程安全的,所以這不是一個好主意。
雖然實體是臨時的(即,您剛剛用新創建的實體),但它沒有附加到會話中,Hibernate不知道它,並且該實體是一個普通的舊Java對象。 因此,這樣做沒問題。我沒有您DAO的所有詳細信息。 如果應該將DAO的方法作為現有事務的一部分來調用,則該方法將不起作用,因為該事務已綁定到當前線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.