2012-03-14 11 views
0

私は10000レコードの保存時間を記録しています。なぜ、10000レコードを保存するのにおよそ40分かかるのかわかりません。私はすべての基本的なセッションファクトリ作業が完了したクラスを持っていますが、それを継承して([DAO(nameofentity)]クラス名に継承し、セッションを保存してからsave関数を要求します。 ?私はそ​​れは大きなディスプレイのようにスクロールダウンlog4jの初期化子を持っている。DBレコードは、休止状態で非常に高い時間を節約します!それはなぜです?

ここで休止状態でセッションを取得するための基底クラスのコードがある。

package DAO; 

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class BaseDAO { 
private static final ThreadLocal<Session> session= new ThreadLocal<Session>(); 

private static final SessionFactory sessionFactory = new Configuration() 
     .configure().buildSessionFactory(); 

public Session getSession() { 

    Session session = (Session) BaseDAO.session.get(); 
    if (session == null) { 
     session = sessionFactory.openSession(); 
     BaseDAO.session.set(session); 
    } 
    return session; 
} 

protected void begin() { 
    getSession().beginTransaction(); 
} 

protected void commit() { 
    getSession().getTransaction().commit(); 

} 


protected void rollback() { 
    try { 
     getSession().getTransaction().rollback(); 
    } catch (HibernateException e) { 
     System.out.println(e.getMessage()); 
    } 
    try { 
     getSession().close(); 
    } catch (HibernateException e) { 
     System.out.println(e.getMessage()); 
    } 
    BaseDAO.session.set(null); 
} 


public void close() { 
    getSession().close(); 
    BaseDAO.session.set(null); 
} 
    } 

その後

 package DAO; 

    import java.util.Iterator; 

    import org.hibernate.HibernateException; 
    import org.hibernate.Query; 

    import pojo.Address; 
    import pojo.Clinic; 
    import pojo.Patient; 

    public class PatientDAO extends BaseDAO { 


    public PatientDAO(){ 

    } 

    It takes more 4 seconds to add just 100 elements so roughly bout 8 mins to 
    add 10K elements. Is there some thing erong with my code. i.e the 
    SAVE() method Below.And ya i tried removing the additional update that i am doing 
    it did not make much difference. 
    I have beeen asked to bring the time for 10K to <1 min..!! :(please help 

    public void create(Patient p) throws ApplicationException { 
    try { 
     begin(); 
     getSession().save(p); 
     Query query = getSession().createQuery 
      ("update Address patientid=? where id=?"); 

     query.setParameter(0,p.getId()); 
     query.setParameter(1, p.getAddress().getId()); 
     query.executeUpdate(); 
     commit(); 

    } catch (HibernateException e) { 
     rollback(); 
     throw new ApplicationException(e.getCause().getMessage()); 
    } 
} 
を拡張するクラス

Hibernate cfg。

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
    <hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">self</property> 
    <property name="hibernate.connection.url"> 
    jdbc:mysql://localhost:3306 /rajtest1</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.default_schema">rajtest1</property> 

    <property name="dialect"> 
      org.hibernate.dialect.MySQLDialect 
     </property> 
     <property name="connection.pool_size">10</property> 

    <!-- property name="current_session_context_class">thread</property--> 
    <!--property 
    name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property--> 
     <property name="show_sql">false</property> 
     <property name="hbm2ddl.auto" >update</property> 
    <mapping resource ="Clinic.hbm.xml"/> 
       <mapping resource="Doctor.hbm.xml"/> 
     <mapping resource="Patient.hbm.xml"/> 
     <mapping resource="Address.hbm.xml"/> 
     </session-factory> 
     </hibernate-configuration> 
+1

私はあなたの質問を言い換えましょう:*私はいくつかのコードを持って、それは遅いです。なぜ?*あなたはそのような質問に答えることができますか? –

+0

私はそれがもっと詳しく知っていたはずです、ごめんなさい。次のコード –

+0

Sorry @JB Nizetのようになります。 。今私はコードを置いた。私は認識しているfrをありがとう –

答えて

1

まず:

あなたはすべての挿入のためにコミットします。それは非効率的です。多くの挿入に対して1つのコミットを行う方が、より効率的です。

第二:

なぜあなたは、患者を作成した後、アドレスの更新をしますか?おそらくあなたは直前に住所を作成したでしょう。アドレスを患者オブジェクトのメンバ(例えば、多対1または一対一の関係)として定義し、単一の保存(カスケードを使用)で両方を挿入するか、後ろにアドレスを挿入する方が効率的ですその患者。この場合、休止状態は、患者の住所を住所に設定することを管理する。

第三:

余分SQL文がある場合は、

第四Hibernate設定ファイルで

<property name="show_sql">true</property> 

を使用してSQL文をトレースして見て

を直接挿入してみてくださいSQLコマンドラインに入力します。おそらく、あなたのデータベースは高速ではありません。

+0

ちょっとありがとう!理由を知ることができない問題を解決しましたが、私はコミット後にセッションを閉じることを開始しました。時間が短縮されました。 –

-1

10000レコードを保存する場合は、一度に1つずつ行うべきではありません。 n_Hibernateを使用する代わりに、セットベースの挿入または更新を行うprocを作成します。

関連する問題