2011-09-07 99 views
3

我們正在廣泛使用NHibernate的多查詢功能並且遇到奇怪的行爲。好像NHibernate不會緩存多重查詢,並且他們總是碰到數據庫。我們使用的是QueryOver,所有查詢都設置爲可緩存的,但當使用-p 1-250:30模式測試blitz.io的主頁時,我可以看到命中數據庫的唯一多查詢獲得了2000+次執行,而其他查詢(如選擇當前登錄用戶)只執行一次或兩次。多重查詢的NHibernate二級緩存

所以問題是:我錯過了什麼或NHibernate不真正緩存多查詢結果?

回答

4

啊哈,明白了!事實證明,這不是所有二級緩存的錯誤,而是我們對QueryOver的使用的責任。

我們正在編寫一個多租戶SaaS應用程序,我們大部分的查詢是這樣的:

return 
    Session.QueryOver<Article>().Cacheable(). 
     Where(a => a.Site == site && a.PublishedAt <= publishedAt). 
     OrderByCoalesceDesc(typeof(DateTime), a => a.UpdatedAt, a => a.CreatedAt). 
     Take(count). 
     Future(); 

而且a.Site == site是問題。顯然,查詢緩存檢查查詢結果是否被緩存的方式基本上是使用SQL語句和所有參數的組合作爲緩存「hashtable」的關鍵字。 SQL語句文本對於我們的多重查詢總是相同的,但參數site是罪魁禍首。 NH會檢查所有提供的參數是否與緩存中已有的參數相匹配,當然我們在Site類中沒有執行Equals(),所以檢查總是失敗。

我們最終什麼了被重寫我們的查詢是這樣的:

var siteID = site.ID; 
return 
    Session.QueryOver<Article>().Cacheable(). 
     Where(a => a.Site.ID == siteID && a.PublishedAt <= publishedAt)...