我有哪些优化Spring / Hibernate页面的选项?

时间:2010-11-29 22:32:34

标签: java database performance hibernate spring

我有一个页面触及数据库中的大量数据。它显示了大量数据,并且还对其进行了大量计算,这将是通过查询或存储过程在组内部进行的非常大的麻烦。拥有域名模型会更容易。

无论如何,因此,Hibernate在提取所有数据时最终会产生大量查询。如果我急切地或懒洋洋地获取数据并不重要......所有查询都达到约600-700毫秒。

个人查询非常快。它们甚至不是1毫秒。但正如您所看到的,此页面对一个表格进行了大量查询,该表格列出了58名学生的培训课程结果:

0 ms  JDBC SELECT (MODULE)
0 ms  JDBC SELECT (TASK)
0 ms  JDBC SELECT (USER_ACCOUNT) // student #1
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (USER_ACCOUNT)
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (USER_ACCOUNT)
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)

0 ms  JDBC SELECT (USER_ACCOUNT) // student #2
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_FILL_IN_THE_BLANK_ANSWER)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_FILL_IN_THE_BLANK_ANSWER)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)

0 ms  JDBC SELECT (USER_ACCOUNT) // student #3
....
0 ms  JDBC SELECT (USER_ACCOUNT) // student #58
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)

30-60名学生参加课程是非常普遍的,所以600-700ms会杀死服务器。

为了解复杂性,这里是1-M关系:

模块(1) - >任务 - > Question->关键字

ActiveModule(1) - > ActiveTask-> ActiveQuestion-> QuestionResult-> Keyword,LanguageKeyword

此外,还有其他1-M链接:

模块 - > ActiveModule

任务 - > ActiveTask

Question-> ActiveQuestion

基本上,这是一个非常复杂的数据图表。

我有什么选择?此应用程序运行的服务器只有1 GB的RAM,因此缓存单个对象几乎是不可能的。我不知道如果让Hibernate发出更少的查询甚至会产生很大的不同。有这么多。

这个应用程序的架构非常像树状,而且非常复杂。不幸的是,所有这些数据都是必需的。树基本上都是全部或全无。

2 个答案:

答案 0 :(得分:1)

使用视图。这应该优化您的联接并减少您必须执行的单个查询的数量。

答案 1 :(得分:0)

我认为您可以使用一个或两个加入

的SQL查询轻松完成此操作

ActiveModule(1) - > ActiveTask-> ActiveQuestion-> QuestionResult-> Keyword,LanguageKeyword

您甚至可以在数据库引擎上卸载一些计算。

对于任何现代数据库来说,这类事情都是微不足道的,忽略hibernate并只是通过原始SQL查询。