爲了在我使用Grails(和GWT)開發的AJAX驅動的應用程序中實現客戶端通知,我實現了一個服務方法,它將阻塞它正在發信號。我正在使用監視器對象來等待信號。一旦發出信號,線程將查詢數據庫中的新對象,然後將實體返回給瀏覽器。在Hibernate和MySQL的等待線程中處理Grails會話InnoDB
它與內存數據庫工作得很好,但不像我期望的那樣使用MySQL數據庫連接器。會發生什麼情況:每當我執行findAllBy ...調用時,它只會查找在請求開始之前創建的對象。
我的服務方法的生命週期
- 從
- Hibernate會話是由Grails的創建客戶端 請求 新對象
- 服務查詢數據庫
- 如果有沒有:等待
- 傳入信號:查詢數據庫中的新對象(使用MySQL時沒有獲得新對象,與內存數據庫正常工作)
mysql查詢日誌顯示所有查詢,但findAllBy ...的結果只是一個空數組。
我禁用了查詢和二級緩存。無論數據連接是否合併,行爲都是相同的。
我在做什麼錯?我應該關閉Hibernate會話嗎?沖洗它?爲我的查詢使用交易?或者以某種方式強制執行findAllBy ...方法來查詢數據庫?
服務本身是transactional = false,但通過@Transactional服務調用。我不需要監視器服務中的事務。 – fabiangebert
我不是100%確定的,但我相信@Transactional優先於服務上的事務屬性,並且會傳播事務。您可能想嘗試將隔離級別更改爲ISOLATION_SERIALIZABLE,並查看是否可以解決問題。 – proflux
服務現在以非事務模式運行。但是,它仍然缺少一些更新。即使它在save(flush:true)調用後發出信號,它在創建對象的事務提交之前有時仍會查詢數據庫。 – fabiangebert