2011-08-03 88 views
1

我是新來的ehcache,我似乎無法找到我所需要的。在ehcache中存儲排序列表

我使用休眠並有一個大型表(500k +項目),我需要快速查詢。

用戶需要對頁面進行retrevial​​頁面,按4個不同的屬性進行排序。我雖然是預先排序這張表,並將它們存儲在4個不同的緩存列表中。用戶還可以搜索該表格。

我該怎麼做?我希望數據自動從數據庫中預取和更新。

回答

0

有趣的問題,實際上Hibernate提供了所有你需要的盒子,但是機制有點複雜。首先你需要二級緩存(L2)。它通過id將每條記錄存儲爲單個項目。這意味着你可以很容易地通過id來查詢你的對象而不需要觸及數據庫

這一點對你沒有任何幫助,這裏是查詢緩存發揮作用。假設你有一個類似的查詢:

SELECT c1, c2, c3, c4 
FROM table 
ORDER BY c1 ASC 
LIMIT 100,20 

你執行這個查詢第一次,Hibernate會運行這個對數據庫,但它也將全部返回的記錄存儲在L2和存儲結果本身(名單的ids)在查詢緩存中。下一次執行完全相同的查詢時,Hibernate將在查詢緩存中找到id列表,然後從L2中逐個獲取每個記錄。

如果您使用略有不同的查詢,Hibernate將運行SQL並將結果存儲在不同的密鑰下。它對查詢緩存使用單獨的緩存,並且通過連接查詢和所有參數來形成密鑰。

我不確定Hibernate是否會將完整的結果存儲在緩存中,並在內存中應用分頁,或者它可能會單獨存儲單個頁面,因此每個查詢的緩存中的元素數量可能會與許多不同的頁面一樣多。如果你這樣走,如果你能啓發我,那將是非常棒的。

另外請注意,任何修改通過的Hibernate做任何行此表將無效所有緩存被查詢與此表。 BTW 500K不是這麼大的表格;-)。如果每個記錄佔用1 KiB,那麼將整個數據庫保存在內存中可能是值得的。

+0

我一直在玩二級緩存通過ehcache,它不提供我需要的性能。每個用戶的查詢本身都會有所不同。數據也不是隻讀的。它將每天更新約1-2次。我不希望第一次打擊變慢,這就是爲什麼我要預取數據。 – kgibbon

0

無論如何500K記錄都不是一個大表。

通過充分配置數據庫(和底層操作系統),您可能獲得最高的性能,以便您的表和必要的索引適合(並保留)高速緩存DB端。 Hibernate的第二級緩存+查詢緩存在這裏沒有多大的幫助,尤其是對於需要以各種方式進行分頁和排序的可變數據時尤其如此。

+0

感謝您的信息。該表將增長至2-3百萬條記錄。讓我提一下,表格有兩個關係正在同時拉動。所以你說從分揀大量項目的最大性能將在數據庫端?預取數據並將其存儲在二級緩存中是不是要走的路? – kgibbon

+0

@kgibbon對於在很少更改的數據上使用的特定查詢,使用查詢緩存很有意義。在2-3百萬條記錄中(分頁+按4種不同的方式排序),您在查詢緩存中尋找相當大的開銷(內存和性能方面)。並且(一部分)必須在每次更改時被刪除/重新獲取。 – ChssPly76

+0

那麼我最好的選擇是什麼?我使用Postgres。我有一個8GB的機器的數據庫,我們還沒有調整。你認爲這是我最好的選擇嗎?讓它來做數據庫來做緩存和排序? – kgibbon