簡體   English   中英

會話數據太多了多少?

[英]How much session data is too much?

我們遇到異常高的內存使用問題。 我觀察到我們代碼中的許多地方都是從DB中提取100條記錄,將其打包在自定義數據對象中,將其添加到arraylist並存儲在會話中。 我想知道在會話中存儲數據的建議上限是多少。 只是一個好習慣不好的做法有點事。

我正在使用JRockit 1.5和1.6GB的RAM。 我使用Jprobe進行了分析,發現應用程序的某些部分內存占用非常大。 大部分數據正在進入會話以供稍后使用。

如果要在會話中存儲數據以提高性能,請考慮使用真正的緩存,因為緩存是應用程序范圍的,而會話是按用戶進行的,這會導致不必要的重復其他類似的對象。

但是,如果您將它們存儲起來供用戶編輯此對象(我懷疑,因為數百個對象太多了),請嘗試最小化存儲的數據量或研究樂觀並發控制。

這完全取決於通常存在多少會話(這又取決於您擁有多少用戶,他們在網站上停留多長時間以及會話超時)以及服務器具有多少RAM。

但首先:您是否真的使用內存分析器告訴您“高內存使用率”是由會話數據引起的,還是只是猜測?

如果您遇到的唯一問題是生產計算機上的“高內存使用率”(即它可以處理生產負載但性能不如您所願),最簡單的解決方案是為服務器獲取更多內存 - 比重新設計應用程序更快,更便宜。

但是,在會話中緩存整個結果集也有不同的原因:如果數據庫中的數據發生變化並且用戶希望看到更改,該怎么辦? 如果要進行緩存,請使用在數據庫請求級別執行此操作的現有系統之一 - 它們允許您在用戶之間緩存結果,並且它們具有緩存失效的功能。

我會說這在很大程度上取決於您期望的活動會話數。 如果您正在編寫一個<20個用戶的Intranet應用程序,那么在會話中添加幾MB肯定沒問題。 但是,如果你期望5000個實時會話,每個會話存儲的每MB數據占5GB的RAM。

但是,我通常建議不要在會話中存儲來自DB的任何數據。 只需從DB獲取每個請求。 如果性能是個問題,請使用應用程序范圍的緩存(例如Hibernate的二級緩存)。

它是什么類型的數據? 它是真的需要每個會話還是可以在應用程序級別緩存? 你真的需要所有的列還是只需要一個子集? 它被訪問的頻率是多少? 需要提供哪些頁面? 等等。

在您真正需要時從數據庫中檢索記錄可能更有意義。 在會話中存儲數百條記錄絕不是一個好策略。

我想說,嘗試存儲足以在后續請求中重新創建必要環境的最小數據量。 如果您要在內存中存儲以避免數據庫往返,那么真正的緩存解決方案(如Memcache)可能會有所幫助。

如果您將這些會話存儲在內存而不是數據庫中,則會保存往返,只要內存負載較低,並且沒有分頁,就會更快地提供請求。 一旦客戶端數量增加並且分頁開始,大多數客戶端的響應時間將大幅減少。 這兩個變量都是反向相關的。

它更好地衡量數據庫服務器的延遲,在大多數情況下通常足夠低,可以被視為一種可行的存儲方式,而不是內存。

嘗試將當前存儲在會話中的數據拆分為用戶特定的靜態數據。 然后實現所有靜態部分的緩存。 這將在應用程序范圍內為您提供大量重用,並且仍允許您緩存用戶正在處理的特定數據。

您還可以創建每個用戶的迷你sqlite數據庫並連接到它,並存儲用戶正在其中訪問的數據,然后在用戶請求時從中檢索記錄,並在用戶斷開連接后刪除sqlite數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM