2011-07-21 77 views
0

爲了在我使用Grails(和GWT)開發的AJAX驅動的應用程序中實現客戶端通知,我實現了一個服務方法,它將阻塞它正在發信號。我正在使用監視器對象來等待信號。一旦發出信號,線程將查詢數據庫中的新對象,然後將實體返回給瀏覽器。在Hibernate和MySQL的等待線程中處理Grails會話InnoDB

它與內存數據庫工作得很好,但不像我期望的那樣使用MySQL數據庫連接器。會發生什麼情況:每當我執行findAllBy ...調用時,它只會查找在請求開始之前創建的對象。

我的服務方法的生命週期

  • Hibernate會話是由Grails的創建客戶端
  • 請求 新對象
  • 服務查詢數據庫
  • 如果有沒有:等待
  • 傳入信號:查詢數據庫中的新對象(使用MySQL時沒有獲得新對象,與內存數據庫正常工作)

mysql查詢日誌顯示所有查詢,但findAllBy ...的結果只是一個空數組。

我禁用了查詢和二級緩存。無論數據連接是否合併,行爲都是相同的。

我在做什麼錯?我應該關閉Hibernate會話嗎?沖洗它?爲我的查詢使用交易?或者以某種方式強制執行findAllBy ...方法來查詢數據庫?

回答

0

只是一個猜測,但這聽起來像一個事務隔離級別問題,您正在經歷幻像讀取。你的服務需要交易嗎?如果未在服務中設置transactional=false

+0

服務本身是transactional = false,但通過@Transactional服務調用。我不需要監視器服務中的事務。 – fabiangebert

+0

我不是100%確定的,但我相信@Transactional優先於服務上的事務屬性,並且會傳播事務。您可能想嘗試將隔離級別更改爲ISOLATION_SERIALIZABLE,並查看是否可以解決問題。 – proflux

+0

服務現在以非事務模式運行。但是,它仍然缺少一些更新。即使它在save(flush:true)調用後發出信號,它在創建對象的事務提交之前有時仍會查詢數據庫。 – fabiangebert

0

我認爲您需要刷新正在尋找的新對象的保存調用的會話,例如,

DomainOfFrequentlyAddedStuff.save(flush:true) 

然後,它們應該被快速保存到數據庫,以便它們將顯示在您的findAll()查詢中。

+0

我已經在使用save(flush:true) - 我可以從MySQL日誌中知道在SELECT查詢之前插入INSERT查詢。即使一分鐘後,findAllBy ...方法也會返回一個空數組。 – fabiangebert

+0

哦,好的。你有沒有嘗試發出一個get()查詢(由id)?在命令行查看數據庫以查看一些新插入的ID後。當然,這不是一個解決方案,但它可能會告訴你它是否是GORM/Hibernate動態查找程序問題。 –

+0

我認爲這只是在插入和其他事務的提交之間執行選擇,而不是在那之後執行 – fabiangebert