2011-07-21 9 views
0

Grails(およびGWT)を使用して開発しているAJAX駆動アプリケーションでクライアント側の通知を実現するために、が通知されています。私はモニターオブジェクトを使って信号を待っています。通知されると、スレッドはデータベースに新しいオブジェクトを照会し、エンティティをブラウザに返します。HibernateとMySQL InnoDBを使用した待機中のスレッドでのGrailsセッション処理

メモリデータベースでは正常に動作していますが、MySQLデータベースコネクタを使用すると期待したとおりに動作しません。何が起こるのか:findAllBy ...呼び出しを行うたびに、リクエストが開始される前に作成されたオブジェクトのみが検索されます。

私のサービスメソッド

Hibernateセッションが何も存在しない場合は、新しいオブジェクト
  • ためのGrails
  • サービス照会データベースによって作成されているクライアント
  • から
    • リクエストのライフサイクル:
    • を待ちます入力信号:新しいオブジェクトのクエリデータベース(は、新しいオブジェクトを取得しません。、MySQLを使用すると、メモリデータベースで正常に動作します)

    mysqlクエリログにはすべてのクエリが期待どおりに表示されますが、findAllBy ...の結果は空の配列に過ぎません。

    私はクエリと2次キャッシュを無効にしました。データ接続がプールされているかどうかにかかわらず、動作は同じです。

    私は間違っていますか? Hibernateセッションを終了する必要がありますか?それをフラッシュ?クエリにトランザクションを使用しますか?または、何とかfindAllBy ...メソッドを使用してデータベースにクエリを実行しますか?

  • 答えて

    0

    ちょうど推測ですが、これはファントム読み取りが発生しているトランザクション分離レベルの問題のようです。あなたのサービスはトランザクションである必要がありますか?サービスにtransactional=falseが設定されていない場合。

    +0

    サービス自体はtransactional = falseですが、@Transactionalでサービスから呼び出されます。私はモニターサービスでトランザクションは必要ありません。 – fabiangebert

    +0

    私は100%確実ではありませんが、@Transactionalはサービスのトランザクション属性よりも優先され、トランザクションを伝播します。分離レベルをISOLATION_SERIALIZABLEに変更し、問題が修正されているかどうか確認してください。 – proflux

    +0

    サービスは現在非トランザクションモードで実行されています。しかし、まだいくつかの更新がありません。 save(flush:true)呼び出しの後に通知されても、オブジェクトを作成しているトランザクションがコミットされる前にデータベースを照会することがあります。 – fabiangebert

    0

    私はあなたが探している新しいオブジェクトの保存呼び出しでセッションをフラッシュする必要があると思います。

    DomainOfFrequentlyAddedStuff.save(flush:true) 
    

    次に、それらはdbに永続的に保存され、findAll()クエリに表示されます。

    +0

    ずに非同期スレッドで.. findByを使用している私はすでに(フラッシュ:真)を保存使用しています - 私はそれをMySQLのログから伝えることができますSELECTクエリの前にINSERTクエリが挿入されます。 1分後でも、findAllBy ...メソッドは空の配列を返します。 – fabiangebert

    +0

    ああ。代わりにget()クエリ(idで)を発行しようとしましたか?コマンドラインでdbを確認した後、新しく挿入されたIDを表示します。もちろん、これは解決策ではありませんが、GORM/Hibernate動的ファインダの問題かどうかを示すことがあります。 –

    +0

    私はそれが実際には、その選択は、その後にではなく、他のトランザクションの挿入とコミットとの間で実行されると考えています – fabiangebert

    関連する問題