将 1 MB 字节数组存储为会话属性

Storing 1 MB byte array as session attribute

我是 运行 一个 Java 网络应用程序。

一位用户上传了一个文件(最大 1 MB),我想存储该文件,直到用户完成整个过程(包括多个请求)。

在用户完成整个过程之前,将文件作为字节数组存储在会话中是否可以?或者就所使用的资源而言,这是否昂贵?

我这样做的原因是因为我最终将文件存储在外部服务器(例如 aws s3)上,但我只想在整个过程完成后将其发送到该服务器。

另一种选择是将文件写入我服务器上的临时文件。但是,这意味着我需要删除该文件以防用户退出网站。但是对我来说,将代码添加到我的 SessionListener 中的 SessionDestroyed 方法似乎过分了,如果它只是针对这个特殊情况,它会删除文件(即:会话是在我不这样做的整个应用程序中创建的)不需要检查临时文件)。

谢谢。

也许是,也许不是

当然,如果符合您的部署限制,将此类数据存储在会话的内存中是合理的。

请记住,每个用户都有自己的会话。因此,如果您的所有用户的 session 中都有这样一个文件,那么您必须乘以计算对内存使用的大致影响。

如果超过memory available at runtime, there will be consequences. Your Servlet container may serialize less-used sessions to storage, which is a problem if you’ve not programmed all of your objects to support serialization. The JVM and OS may use a swap file to move contents out of real memory as part of the virtual memory系统的金额。这种交换可能会影响甚至削弱性能。

你必须考虑你的运行时间部署限制,你没有透露。您 运行 正在使用 Raspberry Pi 或可用内存很少的廉价小型云服务器吗?或者您会 运行 在具有一半 terabyte RAM 的企业 class 服务器上吗?您有 3 个用户、300 个还是 30,000 个?您需要收集运行ch 数字并确定您的需求,也许还需要做一些运行时间分析以查看实际使用情况。

例如……我使用 Vaadin Framework, a sophisticated package for creating desktop-style apps within a web browser. Being Servlet-based, Vaadin maintains a complete representation of each user’s entire work data on the server-side in the Servlet session. Multiplied by the number of users, and depending on the complexity of the app, this may require much memory. So I need to account for this and run my server on sufficient hardware with 64-bit Java tuned to run with a large amount of memory. Or take other approaches such load-balancing across multiple servers with sticky sessions.

编写网络应用程序

幸运的是,现在的 RAM 很便宜。并且具有对 RAM modules, 64-bit operating systems, and 64-bit JVM implementations ( Azul, others 的大量物理支持的 64 位硬件都很容易获得。