簡體   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