当成千上万的用户一次访问该网站时,在会话中存储对象列表是一个好主意吗?

时间:2019-05-24 10:54:35

标签: java spring spring-mvc session memory

我正在开发School erp系统,该系统还具有在线考试功能。

我的问题是

  1. 在会议中以及当学生单击下一个问题时,还是在会议中存储多项选择题(每个学生大约50个问题,一次同时考试超过1000个,每个问题有4个答案)是一个好主意吗?上一个问题,我将从会话中获取下一个问题并返回页面,随着学生的增加,是否会引起内存不足的问题?

  2. 在erp中的所有用例中,无论我们显示的列表是假设显示特定班级的学生列表,我们都将其置于会话中并显示该列表,当管理员单击edit student时,我们将传递表中记录的索引,并基于索引从会话中获取相同的记录,并将其传递到编辑视图页面。这是个坏主意吗?

每当用户移动到不同的用例(例如学生列表用例)以标记用例时,我们都会从前一个用例中清除会话中的数据。

两种情况下的最佳实践或解决方案是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

Http请求没有状态。每个http请求都是分开的。后端服务器无法通过http请求区分不同的用户。所以  后端服务器向浏览器发送一个名为JSESSIONID的cookie,当浏览器使用该cookie向服务器发送请求时,可用于标记用户。

会话寿命有限。在tomcat中,默认会话超时为30分钟。您可以在$CATALINA_BASE/conf/web.xml中找到此配置。

<!-- ==================== Default Session Configuration ================= -->
<!-- You can set the default session timeout (in minutes) for all newly   -->
<!-- created sessions by modifying the value below.                       -->

<session-config>
  <session-timeout>30</session-timeout>
</session-config>

如果用户在09:00访问您的Web服务器,并且在09:31之前没有其他请求,则该用户的会话将被破坏。但是根据您的情况,您可以将会话超时设置为比检查时间更多。我认为这是一个小把戏。

另一个问题,会话与浏览器绑定。如果学生关闭并重新打开浏览器,或打开其他浏览器,他的问题将重新生成,并且他在原始浏览器窗口中所做的一切将永远消失。我不知道erp系统可以接受这一点。

并且会话仅支持一台后端服务器。如果您为erp系统部署了几台服务器,并使用nginx转发请求和负载平衡,那将会有问题。

如果仅为erp系统部署一个实例,则可以只将一张地图存储在内存中,键是学生的ID,值是问题的ID。

如果erp系统是分布式系统,则应使用哈希将数据存储到redis中。

顺便说一句,您可以将所有问题返回到前端,然后使用js进行处理。