2016-08-04 52 views
0

我最近接管了一个支持项目,其中一个Web应用程序在加载页面时数据非常糟糕。在排除故障后,我发现它从DB中提取的记录数是8541,并存储在名为originalList的列表中。然后,列表根据特定条件进行过滤,并存储在名为filteredList的列表中,计数为2170.这两个列表都存储在会话对象中。然后在屏幕上显示filteredList。在整个过程中,需要一分多钟的时间,因为它有时会得到超时(请注意,代理服务器上的最大超时时间设置为1分钟,我们不能更改)。这发生在屏幕上加载并且不需要人工干预。Java设计:动态查询或会话数据存储

在会话中存储两个列表的原因是:屏幕还有一些搜索条件,用户填写特定的搜索框并单击搜索按钮。系统试图根据搜索条件从名为originalList的列表中过滤数据,而不是从数据库中获取数据。这是由用户触发的。

问题:

  • 它是明智的大量数据存储在会话?
  • 为什么在屏幕上加载〜2000条记录需要一分多钟?
  • 会话中的大量数据会影响数据在屏幕上的加载吗?
  • 当用户触发搜索时,将设计更改为从数据库获取数据而不是从会话访问可以吗?

用到的技术:

  • SQL服务器
  • 的Java 1.6
  • 的Struts 2
  • 平原JDBC(无ORM框架)
  • 普通的JavaScript(无jQuery的)

由于它是以非常古老的方式开发的,我无法改变框架。

+0

您可以使用单例来保存Web应用程序中的数据。 –

+0

有太多可能的答案,或者对于这种格式,答案太长。请添加详细信息以缩小答案集或隔离几个段落中可以回答的问题。 –

回答

0

建议在会话中存储大量数据吗?

不可以。您正在会话中存储10K(8000 + 2000)记录。会话是每个用户。如果您有1000个用户,则您将在内存中存储100万条记录。你有多少RAM?顺便说一句,即使有无限量的RAM,也是浪费,不需要,没有附加价值......这是错误的。

为什么在屏幕上加载〜2000条记录需要一分多钟?

我们应该看看你的代码,但考虑如何处理会话事件,可能有其他的罪魁祸首......它可能是任何地方的任何东西。启用devMode,进行调试日志记录,尝试找到瓶颈所在。

会话中的大量数据会影响数据在屏幕上的加载吗?

也许。

当用户触发搜索时,可以更改设计以从数据库获取数据而不是从会话访问吗?

绝对。

你或者编写软件的人不知道(或者无法避免地避免)这个问题的最简单的解决方案:PAGINATION

如果您使用普通JDBC,则更容易。

你有8000条记录,(或800万点的记录,也没关系):而不是加载所有的人,然后将过滤和排序,你

  • 发送页面大小(默认:20每页记录)
  • 发送页面参数(默认为1)
  • 发送标准参数(默认值:无)
  • 发送订单参数(默认:id字段,或日期字段,或其他)

然后您创建查询,说您需要一个PAGE_SIZE数量的记录,从PAGE * PAGE_SIZE开始,WHERE过滤器从CRITERIA中获取,ORDER by order ordering参数。

Here is how to do it with SQL Server

您将始终访问数据库,但只能取出20-50-100条记录,而不是8000. RAM将始终空闲,列表将为一个和小,并且页面将载入小于1 -2秒。 PS:按照Scary Wombat的建议,如果你有少量的记录(8000很小)和大量的访问,你可以考虑在Singleton中缓存列表(所以不会在会话中,每个用户一次,但在一个集中的对象,它会带来更多的复杂性,因为你不得不处理刷新数据,同步等......所以在这种情况下,我只用分页去。


注意:没有必要改变框架,但我一定会考虑迁移到最新版本的Struts 2.3.x。也许需要一些调整,但是你会在安全性和性能方面获得很多(取决于你现在的版本)。