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

时间:2018-02-10 17:03:04

标签: java session httpsession

我正在运行Java Web应用程序。

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

也许是,也许不是

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

请记住,每个用户都有自己的会话。因此,如果您的所有用户都在session中拥有此类文件,那么您必须相乘以计算对内存使用量的近似影响。

如果超过运行时可用的memory,将会产生后果。您的Servlet container可能会serialize使用较少的会话进行存储,如果您没有编程所有对象以支持序列化,则会出现问题。作为JVM系统的一部分,virtual memory和OS可以使用交换文件将内容移出实际内存。交换可能会影响甚至削弱性能。

您必须考虑您未披露的运行时部署限制。你是在运行Raspberry Pi还是廉价的小型云服务器上运行?或者您将在具有半terabyte RAM的企业级服务器上运行?你有3个用户,300或30,000吗?您需要处理数字并确定您的需求,并可能进行一些运行时分析以查看实际使用情况。

例如......我使用Vaadin Framework编写Web应用程序,这是一个用于在Web浏览器中创建桌面式应用程序的复杂程序包。基于Servlet,Vaadin在Servlet会话中维护服务器端每个用户的整个工作数据的完整表示。乘以用户数量,并且根据应用程序的复杂程度,这可能需要大量内存。因此,我需要考虑到这一点,并在64-bit Java调整为运行大量内存的足够硬件上运行我的服务器。或者使用load-balancing在多个服务器上采用其他方法sticky sessions

幸运的是,RAM现在非常便宜。对RAM modules,64位操作系统和64位JVM实现(Azulothers具有大量物理支持的64位硬件都可以随时使用。