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

如果我删除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()
        }
    }

    ...
}

权限.groovy:

class Permissions {
    boolean publishStream = false
}
4

3 回答 3

0

Had the same exception thrown from a migration script, solved it in the following way (Grails 2.2.0):

User.withNewSession {
    // ...
}
于 2014-12-05T10:16:54.280 回答
0

在使用 GSP 和 TagLib 时负责使休眠会话可用的 OpenSessionInView 在您的布局中不可用。

当我遇到这个问题时,我的解决方案是用闭包包装数据库调用withTransaction

def myTag = { attrs, body ->
  User.withTransaction {
    //GORM methods...
  }
}
于 2013-06-03T12:30:46.677 回答
0

有关信息:我使用 WAS 服务器,我认为休眠和连接池之间存在连接。所以,我决定不关闭我的连接并检查休眠是使用 WAS 上的连接还是打开一个新连接。我看到问题已经消失,最后只有一个空闲连接。所以我的建议(如果您使用 WAS 服务器和单例连接架构师)您应该尽量不要在到达此代码之前关闭最后使用的连接

于 2015-09-30T01:16:04.397 回答