2013-05-26 27 views
5

Tôi vừa gặp phải vấn đề mà tôi không hiểu. Ứng dụng grails (2.2.2) của chúng tôi là ném ngoại lệ sau ngay sau khi người dùng đầu tiên đăng nhập. Khi đã xong, không ai từng thấy lại. Hiện tại chúng tôi đang tái tạo nó với một bài kiểm tra Geb.Grails & HibernateException: proxy kết nối không thể sử dụng được sau khi hoàn tất giao dịch

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 

Dòng trong ActivityRatingTagLib (gọi bằng một GSP) là khá đơn giản:

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

Nếu tôi loại bỏ các User.get() ở đây và truy cập vào session.user ngay lập tức, mọi thứ suôn sẻ nhưng sau đó nó bị treo trong cuộc gọi TagLib tiếp theo, trong đó Người dùng được truy cập thông qua User.get().

Tôi đã tìm kiếm trên Internet nhiều giải pháp ngay bây giờ nhưng chưa có gì hữu ích. Vì ngoại lệ này dường như không phổ biến, tôi đoán chúng tôi đang làm điều gì đó sai về cơ bản.

Tôi rất vui vì bất kỳ ý tưởng nào chúng tôi có thể thử và nếu bạn cần thêm thông tin, hãy cho tôi biết!

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

Tôi cho rằng bạn cần tìm nạp 'quyền 'một cách háo hức (' quyền lười: sai') trong khi nhận được 'người dùng'. Nhưng trước khi đưa ra tuyên bố của tôi, nếu bạn có thể hiển thị miền 'Người dùng' được đề cập sẽ tốt. – dmahapatro

+0

Các quyền được nhúng và do đó phải được tải mọi lúc. Tôi đã thêm hai lớp! – Moritz

+1

ActivityRatingTagLib có được gọi bên trong bố cục không? –

Trả lời

0

Các OpenSessionInView, chịu trách nhiệm làm cho phiên ngủ đông có sẵn khi làm việc với GSP và TagLib là không có sẵn trong bố trí của bạn.

Giải pháp của tôi khi tôi trúng vấn đề này là để bọc các cơ sở dữ liệu các cuộc gọi với việc đóng cửa withTransaction:

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

Vì vậy, tôi cuối cùng đã cố gắng này và nó không hoạt động: ( – Moritz

0

Có phải cùng một ngoại lệ ném từ một kịch bản di dân, giải quyết nó theo cách sau (Grails 2.2.0):

User.withNewSession { 
    // ... 
} 
0

Để biết thông tin: tôi sử dụng máy chủ WS và tôi nghĩ có kết nối giữa hibernate và là hồ bơi kết nối. Vì vậy, tôi quyết định không đóng conn của tôi và kiểm tra xem hibernate sử dụng kết nối trên WAS hoặc mở một cái mới. Tôi thấy rằng vấn đề đã biến mất và chỉ có một kết nối là nhàn rỗi ở cuối. Vì vậy, lời khuyên của tôi (nếu bạn sử dụng máy chủ WS và kiến ​​trúc sư kết nối đơn), bạn nên cố gắng không đóng kết nối đã sử dụng trước khi đạt đến mã này

Các vấn đề liên quan