2010-12-07 43 views
2

我需要确认一个理论。我正在学习JSP/Java。JSP会话内存?

看过现有的应用程序(我没有写)后,我注意到我认为导致我们的性能问题的东西。或者至少有一些。

它的工作原理是这样的:

1)用户打开搜索页面。

2)搜索页面(默认)会关闭所有行。其中329,000人。是。 329K。进入ArrayList。 ArrayList中的每个项目都是绑定到数据库表的自定义JavaBean。

3)ArrayList然后传递给PaginateResultSet。 4)将PaginateResultSet(prs)(329k行)存储在会话变量中: session.setAttribute(“resultSet”,prs); 5)每增加一个“下一页”,然后从getAttribute(“resultSet”)抓取20行并发送到Ext数据网格。

好的,现在,我错误地认为巨大的结果集存储在每个用户的每个线程的SERVER内存中?所以如果这个结果集占用了20M内存,并且我们有20个并发用户,那么现在我们从服务器上获得了400M的内存呢?

在会话属性中传递这么多数据不是一个坏主意吗?

感谢您的指点。

回答

3

这是肯定是一个坏主意将整个数据库表内容复制到Java的内存中,更不用说在多用户环境中的用户会话中。

您需要在数据库级别进行分页并在请求范围内存储只有感兴趣的行。如何完成此操作取决于数据库接口和使用的数据库。如果您使用的是基本的JDBC,则可能会发现this answer有用。对于核心Hibernate或JPA,请参见this answer

+0

谢谢。这也是我的想法。他们正在使用Hibernate,但我不确定到底是什么级别。这329k行正在快速增长。上周是27万。因此,当我们发展到更多用户时,这种方法真的开始崩溃。 – cbmeeks 2010-12-07 20:40:09