2010-04-26 51 views
2

我在MVC 2.0應用程序中使用NHibernate。基本上我想跟蹤每個產品在搜索結果中出現的次數。例如,當有人搜索一個小部件時,名爲WidgetA的產品將顯示在搜索結果的第一頁。在這一點上,我將增加數據庫中的字段以反映它作爲搜索結果的一部分出現。NHibernate的 - 日誌項目出現在搜索結果

雖然這很簡單,但我擔心插入本身會大大減慢搜索結果的速度。我想一起批處理我的聲明,但似乎將我的插入與我的選擇耦合可能會產生反作用。有沒有人試圖在NHibernate中做到這一點,如果是的話,是否有任何標準模式來完成這種操作?

+0

這些計數將用於什麼(也許有另一種方法來解決這個問題)? – R0MANARMY 2010-04-26 17:39:45

+0

他們將主要用於展示產品佈局的有效性。例如,如果您是供應商在我的網站上出售某種商品,則可以告知a)有多少人看過您的商品,以及b)在搜索結果中看到了多少次商品。 – 2010-04-26 18:04:39

回答

1

有趣的問題!

這裏是一個可能的解決方案:

var searchResults = session.CreateCriteria<Product>() 
    //your query parameters here 
    .List<Product>(); 
session.CreateQuery(@"update Product set SearchCount = SearchCount + 1 
         where Id in (:productIds)") 
     .SetParameterList("productIds", searchResults.Select(p => p.Id).ToList()) 
     .ExecuteUpdate(); 

當然,你可以做標準,HQL,SQL,LINQ的等搜索

更新查詢是針對所有對象單次往返,所以性能影響應該很小。

+0

迭戈,這是一個相當不錯的方法 - 謝謝。我擔心的是,阻止產品表上的鎖可能會影響整個搜索的性能,但我想唯一真正的解決方法是單獨處理更新(異步和/或通過隊列)。我認爲這個解決方案非常優雅,無疑將在其他地方使用。謝謝! – 2010-05-03 17:33:41

+0

如果以後立即提交,則不會持有鎖定......無鎖定替代方法是隻有一個僅用於插入的表格,您只記錄產品ID,然後由另一個進程將其彙總以更新計數。 – 2010-05-03 17:59:06

相關問題