2013-05-26 9 views
5

Ich lief gerade in ein Problem, das ich nicht verstehe. Unsere grails (2.2.2) App wirft die folgende Ausnahme direkt nachdem der erste Benutzer angemeldet ist. Sobald das erledigt ist, hat niemand es jemals wieder gesehen. Derzeit reproduzieren wir es mit einem Geb-Test.Grails & HibernateException: connection Proxy nicht verwendbar nach Transaktion completio

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 

Die Linie im ActivityRatingTagLib (durch einen gsp genannt) ist ziemlich einfach: Werke alles

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

Wenn ich die User.get() hier entfernen und die session.user Zugriff sofort, Gut, aber dann stürzt es beim nächsten TagLib-Aufruf ab, bei dem der Benutzer über User.get() erreicht wird.

Ich suchte im Internet nach Lösungen, aber es gab noch nichts Nützliches. Da diese Ausnahme eher ungewöhnlich erscheint, tun wir etwas grundsätzlich falsch.

Ich wäre ziemlich glücklich über jede Idee, was wir versuchen könnten und wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen!

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

Ich nehme an, Sie müssen "Berechtigungen" eifrig holen ('Berechtigungen faul: false') während der "Benutzer". Aber bevor Sie meine Aussage machen, können Sie, wenn Sie die Domäne "Benutzer" in Frage stellen, das gut sein. – dmahapatro

+0

Die Berechtigungen sind eingebettet und sollten daher die ganze Zeit geladen werden. Ich habe die beiden Klassen trotzdem hinzugefügt! – Moritz

+1

Wird ActivityRatingTagLib in einem Layout aufgerufen? –

Antwort

0

Die OpenSessionInView, verantwortlich für die Herstellung der Hibernate-Session zur Verfügung, wenn sie mit APS der Arbeit und TagLib die ist in Ihrem Layout nicht zur Verfügung.

Meine Lösung, wenn ich treffe dieses Problem der Datenbank ruft mit der Schließung withTransaction zu wickeln war:

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

Also habe ich endlich das versucht und es funktioniert nicht :( – Moritz

0

hatte die gleiche Ausnahme von einem Migrationsskript geworfen, löste es in der folgenden Art und Weise (Grails 2.2.0):

0

Zur Information: Ich benutze WAS-Server und ich denke, es gibt eine Verbindung zwischen Ruhezustand und war Verbindungspool. Also habe ich mich entschieden, meine Verbindung nicht zu schließen und überprüft, ob Hibernate die Verbindung auf WAS verwendet oder eine neue öffnet. Ich sah, dass das Problem verschwunden war und am Ende nur noch eine Verbindung brach lag. Also mein Ratschlag (wenn Sie WAS Server und einen Singleton Connection Architect verwenden) sollten Sie versuchen, die zuletzt verwendete Verbindung nicht zu schließen, bevor Sie diesen Code erreichen.