Web システムでいくつかのメンテナンスを行いました。このシステムは Java、Struts2、および Hibernate 3 で行われました。私の顧客から緊急に求められた項目の 1 つは、ログインが非常に遅いため、修正することでした。
ユーザーがいつログインしたかを特定できました.Hibernateは、ログインとは関係のないさまざまなテーブルでデータベースに対して多くのクエリを生成します.
私の関係は 3 つのテーブルです: User、Student、Teacher
学生
- ID
- 名前
先生
- ID
- 名前
ユーザー
- ID
- ログイン
- パスワード
学生がログインするたびに、クエリは正しいログインとパスワードであるかどうか、および ID が Student テーブルに存在するかどうかを確認します。ご覧のとおり、Student テーブルの ID_USER などの外部キー ID はありません。
私のクエリ:
Student student =(Student)session.createCriteria(Student.class)
.add( Property.forName("login").eq(login) )
.add( Property.forName("password").eq(password) )
.setMaxResults(1)
.uniqueResult();
- Student は User から継承します...
私の User.hbm.xml
...
<class name="com.xxx.User" table="TBL_USERS" discriminator-value="0" lazy="true">
<id name="id" column="ID">
<generator class="sequence">
<param name="sequence">seq_users</param>
</generator>
</id>
<discriminator column="TYPE" insert="true" />
<subclass name="com.xxx.Student" discriminator-value="1" lazy="true">
<join table="TBL_STUDENTS">
<key column="ID"/>
<property name="name" column="NAME"/>
</join>
</subclass>
<subclass name="com.xxx.Teacher" discriminator-value="2" lazy="true">
<join table="TBL_TEACHERS">
<key column="ID" />
<property name="name" column="NAME" />
</join>
</subclass>
...
私のHibernateログには、次のような多くの奇妙なクエリが記録されています。
ログイン アクションが遅いため、20 以上の異なるテーブルで発生し、常に繰り返されています。しかし、なぜそれが起こっているのかわかりません.Hibernateの経験はあまりありません.
休止状態:
select
exerc0_.ID_CLASS as ID6_1_,
exerc0_.ID as ID1_,
exerc0_.ID as ID14_0_,
exerc0_.DATE_ENT as DATA2_14_0_,
exerc0_.TITLE as TITTLE14_0_,
exerc0_.TEXT as TEXT14_0_,
exerc0_.TYPE_EXERC as TYPE5_14_0_,
exerc0_.ID_CLASS as ID6_14_0_
from
TBL_EXERC exerc0_
where
exerc0_.ID_CLASS=?
何が起こっている可能性がありますか?