2017-04-20 71 views
1

我的項目有鎖定hibernate 3.3.2.GA版本的行機制,我們正在計劃升級到休眠5.我打算讓這個查詢工作在更舊的休眠和更新的版本以及。休眠LockOptions超時

這是Hibernate 3.3.2.GA

如果該行被鎖定在會議上已經這個查詢將鎖定該行現有的查詢,將等到超時,並拋出超時如果超過。

Query query = session.getNamedQuery("select aps from WritableSchool aps where aps.schoolCd = :schoolCd"); 
query.setParameter("schoolCd", schoolCd); 
query.setTimeout(2); // seconds 
query.setLockMode("aps", LockMode.UPGRADE); 
List<WritableSchool> schools = query.list(); 

當我們升級到休眠五分之四的版本,超時工作不就永遠等待鎖獲取如果表被鎖定在會話了。

在休眠4相同的代碼我想更換鎖和超時這樣 query.setLockOptions(new LockOptions(LockMode.UPGRADE).setTimeOut(100));

它仍然沒能得到超時工作。

我嘗試了另一種方式。

session.buildLockRequest(LockOptions.NONE).setLockMode(LockMode.UPGRADE).setTimeOut(2000).lock(school);

據執行選擇。對於更新,但沒有履行的時間了,但是我實現。

目前我唯一的解決方案是重寫hibernate oracle dialect,並將shouldUseFollowOnLocking()設置爲false,同時獲得鎖定和榮譽超時。

我想知道爲什麼超時在休眠鎖定選項不符合。如果任何人有任何想法鎖定和超時休眠,請幫助,謝謝。

回答

0

嘗試了一些可能的方法後,我發現這種方式我們可以設置鎖定超時兼容與休眠3.5.6到當前休眠版本無任何問題。

Session session = ((Session) em.getDelegate()); 
Query query = session.getNamedQuery("select aps from WritableSchool aps where aps.schoolCd = :schoolCd"); query.setParameter("schoolCd", schoolCd); 
WritableSchool schools = query.list().get(0); 
session.buildLockRequest(LockOptions.NONE).setLockMode(LockMode.PESSIMISTIC_WRITE).setTimeOut(2000).lock(aliasPoolSeq); 

第二種方式,但這從3.5.6和所有其他更高版本的作品。

school = (WritableSchool) session.get(WritableSchool .class, primaryKey, 
         new LockOptions(LockMode.PESSIMISTIC_WRITE).setTimeOut(QUERY_TIMEOUT_SEC * 1000)) 
0

我找到替代的解決方案,以及其中,如果你被允許在你的項目延長休眠方言與不同的休眠版本的作品。你可以覆蓋這種方式

public class Oracle10gDialectExtension extends Oracle10gDialect implements DialectExtension 
{ 

    @Override 
    public boolean useFollowOnLocking() 
    { 
     return false; 
    } 
}