我有緩存用戶信息而不是在每個請求(共享Ehcache)上從用戶存儲中檢索它的servlet。我的問題是,如果客戶端是多線程和他們做一個以上的併發請求,他們已經通過驗證前,然後我得到這個在我的日誌:鎖定緩存密鑰而不鎖定整個緩存
Retrieving User [Bob]
Retrieving User [Bob]
Retrieving User [Bob]
Returned [Bob] ...caching
Returned [Bob] ...caching
Returned [Bob] ...caching
我想的是,第一個請求就撥打的用戶服務,而其他兩個請求被阻塞 - 與第一個請求返回時,然後緩存對象,另外兩個請求都通過:
Retrieving User [Bob]
blocking...
blocking...
Returned [Bob] ...caching
[Bob] found in cache
[Bob] found in cache
我想過上鎖定字符串「鮑勃」(因爲實習它始終是同一個對象?)。這會起作用嗎?如果是這樣的話,我該如何跟蹤實際存在於緩存中的密鑰並在它們周圍建立一個鎖定機制,然後在檢索到該對象後返回該有效對象。謝謝。
這非常接近我的想法,因爲某些原因,鎖定在實際上的字符串看起來像是一個非常糟糕的主意。但在這種情況下,我鎖定了Map上的每個調用 - 但我想這不是那麼不同(性能明智),然後我的緩存由所有線程共享。我認爲即使這種開銷仍然快得多,然後對我的用戶身份驗證提供程序進行多次不必要的調用。 – Gandalf 2010-04-14 19:53:39