【发布时间】: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