1

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=?

何が起こっている可能性がありますか?

4

1 に答える 1

0

この質問を永遠に開いたままにしないために。問題はかなり前に修正されましたが、返信するのを完全に忘れていました。いくつかの遅延読み込みを有効にし、他のいくつかの場所で SET ではなく LIST を選択するようにする必要がありました。LISTを使用すると、よりパフォーマンスが向上したようです。

@フィーロはなんとなく合っていた。

于 2015-01-05T21:11:41.353 に答える