Grails(およびGWT)を使用して開発しているAJAX駆動アプリケーションでクライアント側の通知を実現するために、が通知されています。私はモニターオブジェクトを使って信号を待っています。通知されると、スレッドはデータベースに新しいオブジェクトを照会し、エンティティをブラウザに返します。HibernateとMySQL InnoDBを使用した待機中のスレッドでのGrailsセッション処理
メモリデータベースでは正常に動作していますが、MySQLデータベースコネクタを使用すると期待したとおりに動作しません。何が起こるのか:findAllBy ...呼び出しを行うたびに、リクエストが開始される前に作成されたオブジェクトのみが検索されます。
私のサービスメソッド
Hibernateセッションが何も存在しない場合は、新しいオブジェクト- リクエストのライフサイクル:
- を待ちます入力信号:新しいオブジェクトのクエリデータベース(は、新しいオブジェクトを取得しません。、MySQLを使用すると、メモリデータベースで正常に動作します)
mysqlクエリログにはすべてのクエリが期待どおりに表示されますが、findAllBy ...の結果は空の配列に過ぎません。
私はクエリと2次キャッシュを無効にしました。データ接続がプールされているかどうかにかかわらず、動作は同じです。
私は間違っていますか? Hibernateセッションを終了する必要がありますか?それをフラッシュ?クエリにトランザクションを使用しますか?または、何とかfindAllBy ...メソッドを使用してデータベースにクエリを実行しますか?
サービス自体はtransactional = falseですが、@Transactionalでサービスから呼び出されます。私はモニターサービスでトランザクションは必要ありません。 – fabiangebert
私は100%確実ではありませんが、@Transactionalはサービスのトランザクション属性よりも優先され、トランザクションを伝播します。分離レベルをISOLATION_SERIALIZABLEに変更し、問題が修正されているかどうか確認してください。 – proflux
サービスは現在非トランザクションモードで実行されています。しかし、まだいくつかの更新がありません。 save(flush:true)呼び出しの後に通知されても、オブジェクトを作成しているトランザクションがコミットされる前にデータベースを照会することがあります。 – fabiangebert