2010-08-24 28 views
15

Tôi đang viết một ứng dụng đa luồng trong Grails và các chủ đề bổ sung cần truy cập vào GORM/Hibernate. Khi họ cố gắng truy cập GORM, tôi nhận được lỗi "org.hibernate.HibernateException: Không có phiên Hibernate nào bị ràng buộc với luồng và cấu hình không cho phép tạo một giao dịch không giao dịch tại đây".Làm cách nào để gắn một phiên Hibernate vào một chuỗi trong Grails?

OK đủ công bằng, ai đó có thể hướng dẫn tôi cách tốt nhất để đặt chuỗi lên để có quyền truy cập? Các thông báo lỗi gần như âm thanh như bạn chỉ cần thay đổi một số tùy chọn cấu hình nhưng tôi cảm giác, nó không phải là đơn giản ...

Trả lời

14
+6

Hai liên kết thứ hai bị hỏng, vị trí có thay đổi không? – Kevin

14

Bạn cần phải đặt bất kỳ cuộc gọi GORM trong một đóng withTransaction. Một ví dụ được lấy từ một cuộc thảo luận về đa luồng tại https://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-grails-gsql-and-gpars/

đơn luồng

user = User.findByUsername(photo.username) 

đa luồng

User.withTransaction{ 
user = User.findByUsername(photo.username) 
} 
+0

Đây có lẽ là cách dễ nhất để sử dụng chuỗi không thường xuyên. – Joseph

1

withNewSession cũng sẽ hoạt động. Trong trường hợp của tôi, tôi có bản cập nhật ưu tiên thấp, nơi bản cập nhật cuối cùng luôn có thể "giành được". version: false cũng rất quan trọng ở đây để tránh StaleObjectException:

 Thread.start { 
     try { 
      Widget.withNewSession { 
       xxx() 
       log.info "Asynchronously did some updates." 
      } 
     } catch (Exception ex) { 
      log.error "Failed to asynchronously do something...", ex 
     } 
    } 
+0

Đây là câu trả lời tôi đang tìm kiếm. _Way_ tốt hơn việc sử dụng 'withTransaction' nếu bạn đang thực hiện một số cập nhật trong nền mà bạn muốn xuất hiện khi chúng đang được thực hiện. – aroth