5

私はちょうど私が理解していない問題に遭遇しました。私たちの grails (2.2.2) アプリは、最初のユーザーがログインした直後に次の例外をスローしています。現在、Geb テストで再現しています。

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) {

hereを削除してUser.get()すぐに session.user にアクセスすると、すべて正常に動作しますが、ユーザーが 経由でアクセスされる次の TagLib 呼び出しでクラッシュしますUser.get()

私は今インターネットで解決策をたくさん探していましたが、まだ有用なものは何もありませんでした. この例外はあまり一般的ではないように思われるので、基本的に何か間違ったことをしていると思いますが、何ですか?

ユーザー.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
}
4

3 に答える 3

0

情報:私はWASサーバーを使用していますが、休止状態と接続プールの間に接続があると思います。そのため、接続を閉じないことにし、休止状態が WAS で接続を使用するか、新しい接続を開くかを確認しました。問題がなくなり、最後にアイドル状態の接続が 1 つしかないことがわかりました。したがって、私のアドバイス (WAS サーバーとシングルトン接続アーキテクトを使用している場合) は、このコードに到達する前に最後に使用した接続を閉じないようにする必要があります。

于 2015-09-30T01:16:04.397 に答える
0

移行スクリプトから同じ例外がスローされた場合、次の方法で解決しました (Grails 2.2.0):

User.withNewSession {
    // ...
}
于 2014-12-05T10:16:54.280 に答える