2017-04-20 3 views
1

私のプロジェクトは、Hibernate 3.3.2.GAバージョンの行メカニズムをロックしています。私たちは、Hibernate 5をリフレッシュする予定です。このクエリを古いHibernateや新しいバージョンでも動作させる予定です。タイムアウトのあるHibernate LockOptions

これは休止状態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月5日のバージョン、タイムアウト休止状態にアップグレードすることは、テーブルがすでにセッションにロックされている場合は取得するためのロックを永遠に待っている機能していません。私は作業時間を得るためにそれがまだできていないこのよう query.setLockOptions(new LockOptions(LockMode.UPGRADE).setTimeOut(100));

をロックして、時間を交換しようとした同じコードで休止状態4では

私は別の方法も試しました。

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

それは、SELECT .. FOR UPDATE実行するが、しかし、私が実装した時間を尊重されていません。

唯一の解決策は、私の手では、休止状態のoracleの方言を無効にして、偽に戻るようにshouldUseFollowOnLocking()を設定することです。これによってロックとタイムアウトも取得されます。

私は休止状態でLockoptionsのタイムアウトが同じことを賞賛していないのだろうと思っています。もし誰かがロックや休止状態でタイムアウトしてしまったら、助けてください、ありがとう。

答えて

0

このようにして見つけた可能性のある方法を試した後、私たちは、ロックアウトをタイムアウトで設定し、現在の休止状態のバージョンにhibernate 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); 

第2の方法ですが、これは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; 
    } 
} 
関連する問題