我有一个页面触及数据库中的大量数据。它显示了大量数据,并且还对其进行了大量计算,这将是通过查询或存储过程在组内部进行的非常大的麻烦。拥有域名模型会更容易。
无论如何,因此,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发出更少的查询甚至会产生很大的不同。有这么多。
这个应用程序的架构非常像树状,而且非常复杂。不幸的是,所有这些数据都是必需的。树基本上都是全部或全无。
答案 0 :(得分:1)
使用视图。这应该优化您的联接并减少您必须执行的单个查询的数量。
答案 1 :(得分:0)
我认为您可以使用一个或两个加入
的SQL查询轻松完成此操作ActiveModule(1) - > ActiveTask-> ActiveQuestion-> QuestionResult-> Keyword,LanguageKeyword
您甚至可以在数据库引擎上卸载一些计算。
对于任何现代数据库来说,这类事情都是微不足道的,忽略hibernate并只是通过原始SQL查询。