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