簡體   English   中英

存儲1 MB字節數組作為會話屬性

[英]Storing 1 MB byte array as session attribute

我正在運行Java Web應用程序。

用戶上載一個文件(最大1 MB),我想存儲該文件,直到用戶完成整個過程(由多個請求組成)為止。

在用戶完成整個過程之前,可以在會話中將文件存儲為字節數組嗎? 還是在使用的資源上昂貴?

我這樣做的原因是因為我最終將文件存儲在外部服務器(例如aws s3)上,但是如果整個過程完成,我只想將其發送到該服務器。

另一種選擇是將文件寫入服務器上的臨時文件。 但是,這意味着如果用戶退出網站,我將需要刪除該文件。 但是對於我來說,將代碼添加到我的SessionListenerSessionDestroyed方法中似乎過多了,如果只是針對這種情況(例如:在整個應用程序中都創建了會話,而我不需要檢查臨時文件),則該文件會刪除該文件。 。

謝謝。

可能是,可能不是

當然,如果適合您的部署限制,則將此類數據存儲在會話的內存中是合理的。

請記住,每個用戶都有自己的會話。 因此,如果所有用戶的session中都有這樣的文件,則必須乘以計算對內存使用量的近似影響。

如果超出了運行時可用的內存量,則會有后果。 您的Servlet容器可能會將使用較少的會話序列化到存儲中,如果您尚未對所有對象進行編程以支持序列化,那么這將是一個問題。 JVM和OS可以使用交換文件將內容移出真實內存,作為虛擬內存系統的一部分。 交換可能會影響甚至削弱性能。

您必須考慮未公開的運行時部署約束。 您是在Raspberry Pi還是運行在可用內存很少的廉價小型雲服務器上? 還是要在具有0.5 TB內存的企業級服務器上運行? 您有3個用戶,300個或30,000個用戶嗎? 您需要計算數字並確定您的需求,並可能需要進行一些運行時分析以查看實際使用情況。

例如……我使用Vaadin Framework編寫Web應用程序, Vaadin Framework是一個復雜的程序包,用於在Web瀏覽器中創建桌面樣式的應用程序。 基於Servlet的Vaadin在Servlet會話的服務器端維護着每個用戶整個工作數據的完整表示。 乘以用戶數量,並取決於應用程序的復雜性,這可能需要大量內存。 因此,我需要考慮這一點,並在足夠的硬件上運行我的服務器,並將其調整為64位 Java以使其能夠運行大量內存。 或者采用其他方法,例如通過粘性會話跨多個服務器進行負載平衡

幸運的是,RAM現在很便宜。 具備大量物理支持RAM模塊 ,64位操作系統和64位JVM實現( Azul )的64位硬件也很容易獲得。

暫無
暫無

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

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