【问题标题】:what approach should I take in heavy iterations? [closed]在大量迭代中我应该采取什么方法? [关闭]
【发布时间】:2011-08-07 08:44:33
【问题描述】:

我得到了这个 Java webapp (JSP+Struts+Hibernate+MySQL+tomcat6),现在有大约 20000 个用户,而且这个数字还在迅速增长。我必须定期对所有用户进行排名。排名过程涉及大量对象和休眠动作,而且相当繁重。说到java,不幸的是我必须迭代所有的用户,并在他们身上一一应用这个过程。这种方法会消耗大量服务器资源。

另一方面,我可能能够在 MySQL 端的存储过程中运行所有这些操作。我很确定代码会一团糟,以后修改起来很麻烦。虽然这样性能会好很多,但软件工程原则不会很好地采用这种解决方案。

你有什么建议?

【问题讨论】:

  • 20000 不是很大的数,应该是算法问题。您的 Big-O 复杂度是多少?您是否在单独的进程中运行它?
  • 会不会是hibernate负载太多了?你使用延迟加载吗?我发现调试级别的日志记录会显示 hibernate 所做的所有查询。它们都是必需的吗?
  • @tjameson:我有 3 个嵌套循环,但与最外部的循环相比,两个内部循环的复杂性微不足道。考虑到 n 作为用户数,复杂度约为 250n。
  • 为什么不把它导出到一个单独的应用程序中,以便在凌晨 2 点没有人的情况下在 chron-job 上运行呢?这应该可以最大限度地减少压力。
  • @extraneon:我确实使用休眠懒惰。所有集合和东西都是惰性的,并且在每次迭代中为每个用户加载一次。但是我想这种重复的休眠动作也可能导致性能下降。对吗?

标签: java boost-iterators


【解决方案1】:

这显然在 SQL 中效率更高。真正的问题是您正在使用休眠,因此失去了对架构的控制,这就是为什么像 iBatis 这样的解决方案虽然不太受欢迎,但更有意义 - 因为它允许您在更合适的工具时切换到 SQL工作。

鉴于您选择了休眠,您确定不能将它提供的 API 推送到执行此操作吗?您是否详细查看过标准 API?这包括关联 - 可能会在其中塞入您想要的东西,从而使逻辑与类更紧密地关联。 http://docs.jboss.org/hibernate/stable/core/reference/en-US/html/querycriteria.html

【讨论】:

  • 感谢您的回复,我想任何有标准的东西也可以用 HQL 来实现,而且标准在性能上并不比 HQL 好。实际上,我尝试使用 HQL 在每次迭代中缩小所需数据的范围。它使这个过程慢了 3000 倍!我有点明白是休眠使这个过程变得缓慢。
  • 这听起来很奇怪。您可能没有定义正确的索引 - 获取已执行的 SQL 的副本,然后在 mysql 中使用“解释”来查看是否有任何线性扫描。 hibernate 本身并不比其他任何东西差 - sql 应该更快,因为您不需要经历创建对象的所有麻烦,并且它应该对事物进行适当的排序(索引)以尽可能快地访问数据。所以如果 sql 或 hsql 较慢,那么很可能是索引问题。
  • 谢谢哥们,我会更深入的...
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多