2013-05-26 8 views
5

私はちょうど私が理解していない問題に遭遇しました。私たちのgrails(2.2.2)アプリケーションは、最初のユーザーがログインした直後に次の例外をスローしています。いったん終了すれば、誰もそれを見たことはありません。現在、Gebテストで再現しています。GrailsとHibernateException:トランザクションの完了後に接続プロキシを使用できない

Caused by HibernateSystemException: connnection proxy not usable after transaction completion; nested exception is org.hibernate.HibernateException: connnection proxy not usable after transaction completion 
->> 24 | doCall in gibbons5.recommender.ActivityRatingTagLib$_closure1 

ActivityRatingTagLib(GSPによって呼び出される)の行は非常に単純です:

if (!User.get(session.user.id).permissions.publishStream) { 

私はここUser.get()を削除して、すぐにすべての作品をsession.userにアクセスする場合しかし、User.get()を介してUserにアクセスする次のTagLib呼び出しでクラッシュします。

私はインターネット上で多くのソリューションを探していましたが、まだ役に立たないものはありませんでした。この例外は珍しいようですが、基本的には間違っていると思います。

私たちが試してみることができるアイデアは大変うれしく、さらに情報が必要な場合はお知らせください!

User.groovy:

class User implements HttpSessionBindingListener { 
    ... 

    boolean isOnline = false 
    Permissions permissions = new Permissions() 

    static embedded = ['infoPopups', 'permissions', 'userSettings'] 

    void valueBound(HttpSessionBindingEvent event) { 
     isOnline = true 
    } 

    void valueUnbound(HttpSessionBindingEvent event) { 
     // we do not have a session any more 
     withTransaction { 
      def user = get(this.id) 
      user.isOnline = false 
      user.save() 
     } 
    } 

    ... 
} 

Permissions.groovy

class Permissions { 
    boolean publishStream = false 
} 
+0

'permissions'をeagerly(' permissions lazy:false') 'user'を取得します。しかし、私の声明を出す前に、問題の 'User'ドメインを表示することができれば良いでしょう。 – dmahapatro

+0

権限が埋め込まれているため、常にロードする必要があります。私はとにかく2つのクラスを追加しました! – Moritz

+1

ActivityRatingTagLibはレイアウト内で呼び出されますか? –

答えて

0

OpenSessionInView、GSPのと協力し、TagLibの者があなたのレイアウトで使用できないときHibernateセッションを利用可能にするための責任。

私のソリューション私はこの問題を襲ったデータベースが閉鎖withTransactionで呼び出すラップした:

def myTag = { attrs, body -> 
    User.withTransaction { 
    //GORM methods... 
    } 
} 
+1

は、だから私は最終的にこれを試してみました、それが動作しません。:(? – Moritz

0

は、移行スクリプトからスロー同じ例外を持っていた(Grailsの2.2.0以下の方法でそれを解決しました):

0

私はWASサーバーを使用しています。私は休止状態と接続プールの間に接続があると思います。だから、私は私のconnを閉じずに、HibernateがWAS上で接続を使用するのか、新しいものを開くのかをチェックしました。私は問題がなくなり、最後にアイドル状態の接続が1つしかないことがわかりました。 (WASサーバーとシングルトン接続アーキテクトを使用している場合)このコードに達する前に最後に使用した接続を閉じないようにしてください。

関連する問題