我是新來的ehcache,我似乎無法找到我所需要的。在ehcache中存儲排序列表
我使用休眠並有一個大型表(500k +項目),我需要快速查詢。
用戶需要對頁面進行retrevial頁面,按4個不同的屬性進行排序。我雖然是預先排序這張表,並將它們存儲在4個不同的緩存列表中。用戶還可以搜索該表格。
我該怎麼做?我希望數據自動從數據庫中預取和更新。
我是新來的ehcache,我似乎無法找到我所需要的。在ehcache中存儲排序列表
我使用休眠並有一個大型表(500k +項目),我需要快速查詢。
用戶需要對頁面進行retrevial頁面,按4個不同的屬性進行排序。我雖然是預先排序這張表,並將它們存儲在4個不同的緩存列表中。用戶還可以搜索該表格。
我該怎麼做?我希望數據自動從數據庫中預取和更新。
有趣的問題,實際上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,那麼將整個數據庫保存在內存中可能是值得的。
無論如何500K記錄都不是一個大表。
通過充分配置數據庫(和底層操作系統),您可能獲得最高的性能,以便您的表和必要的索引適合(並保留)高速緩存DB端。 Hibernate的第二級緩存+查詢緩存在這裏沒有多大的幫助,尤其是對於需要以各種方式進行分頁和排序的可變數據時尤其如此。
感謝您的信息。該表將增長至2-3百萬條記錄。讓我提一下,表格有兩個關係正在同時拉動。所以你說從分揀大量項目的最大性能將在數據庫端?預取數據並將其存儲在二級緩存中是不是要走的路? – kgibbon
@kgibbon對於在很少更改的數據上使用的特定查詢,使用查詢緩存很有意義。在2-3百萬條記錄中(分頁+按4種不同的方式排序),您在查詢緩存中尋找相當大的開銷(內存和性能方面)。並且(一部分)必須在每次更改時被刪除/重新獲取。 – ChssPly76
那麼我最好的選擇是什麼?我使用Postgres。我有一個8GB的機器的數據庫,我們還沒有調整。你認爲這是我最好的選擇嗎?讓它來做數據庫來做緩存和排序? – kgibbon
我一直在玩二級緩存通過ehcache,它不提供我需要的性能。每個用戶的查詢本身都會有所不同。數據也不是隻讀的。它將每天更新約1-2次。我不希望第一次打擊變慢,這就是爲什麼我要預取數據。 – kgibbon