我是JProfiling我的应用程序来分析高CPU使用率。用户登录时CPU使用率为100%(在服务器)。所以开始分析我的应用程序。
我在堆转储中找到的以下查询字符串。不仅这4个查询,转储中有数百个这样的查询。
java.lang.String (0x3262b1) ["/* load com.v4common.shared.beans.transaction.ControlTransaction */ select controltra0_.id as id47_48_, controltra0_.form_transaction_id as form2_47_48_, controltra0_.string_value as string3_47_48_, c"] 129 kB (0 %)
java.lang.String (0x310b2f) ["/* load com.v4common.shared.beans.transaction.ReportTransaction */ select reporttran0_.id as id158_45_, reporttran0_.report_id as report2_158_45_, reporttran0_.norm_id as norm3_158_45_, reporttran0_.d"] 124 kB (0 %)
java.lang.String (0x312222) ["/* load com.v4common.shared.beans.transaction.ReportItemTransaction */ select reportitem0_.id as id160_41_, reportitem0_.report_structure as report2_160_41_, reportitem0_.grid_row_criteria as grid3_16"] 110 kB (0 %)
java.lang.String (0x30c104) ["/* load com.v4common.shared.beans.Reports.EsenderCSReport */ select esendercsr0_.id as id117_36_, esendercsr0_.name as name117_36_, esendercsr0_.report_type as report3_117_36_, esendercsr0_.is_show_pr"] 94,248 bytes (0 %)
java.lang.String (0x30d1dc) ["/* load com.v4common.shared.beans.Reports.ReportStructure */ select reportstru0_.id as id120_35_, reportstru0_.name as name120_35_, reportstru0_.xml as xml120_35_, reportstru0_.esender_format as esend"] 90,736 bytes (0 %)
我刚刚登录系统,我根本没有碰到豆子,我仍然可以在转储中看到它们。
为什么转储中存在这些字符串的想法?
或者这条线甚至意味着什么?
答案 0 :(得分:5)
这是正常的,这些是在服务器启动时准备的Hibernate预先准备的查询。
以ControlTransaction
类为例。 Hibernate已经知道可能需要查询来按ID选择实体,删除它们等等。
因此它预先生成一系列SQL预处理语句来执行这些操作。每个查询开头的注释表明它们生成的原因。
例如,生成此查询以通过Id加载ControlTransaction:
/* load com.v4common.shared.beans.transaction.ControlTransaction */
select controltra0_.id as id47_48_, controltra0_.form_transaction_id as form2_47_48_, controltra0_.string_value as string3_47_48_, c
以one-to-many
或one-to-one
的注释开头的查询用于延迟加载等。在JPQL / HQL中的命名查询也在服务器启动时编译为SQL查询,注释标识哪个命名查询发起了SQL查询。
每个实体都会产生一些这样的查询,具体取决于所使用的映射注释。
因此,在用户首次登录时堆中存在这些查询通常是正常的。
答案 1 :(得分:0)
您是否在任何实体上以@NamedQueries
(或@NamedQuery
)的身份提出了这些问题?
Hibernate可能会在服务器启动时将命名查询加载到它的缓存中。它们肯定在启动时被解析以检查语法等。