数据库记录在休眠时节省的时间非常长!为什么?

时间:2012-03-14 05:27:59

标签: database hibernate unit-testing

我正在记录10000条记录的保存时间,我不知道为什么它需要40分钟才能保存10000条记录。我有一个类,其中所有基本会话工厂工作完成然后我扩展(继承到[DAO(nameofentity)]类名称并请求getsession然后保存功能。为什么它需要花费这么多时间?我有log4j初始化程序,它像一个大显示器向下滚动。

以下是在hibernate中获取会话的基类代码。

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>

2 个答案:

答案 0 :(得分:1)

首先:

您为每个插入执行提交。这是低效的。对许多插入进行一次提交绝对更有效。

第二

为什么在创建患者后对地址进行更新?可能你刚刚创建了地址。将地址定义为患者对象的成员(例如,具有多对一或一对一关系)并将两者一起插入一次保存(使用级联)或在之后插入地址更有效病人。在这种情况下,hibernate管理在地址中设置patientid。

第三

使用

跟踪SQL语句
<property name="show_sql">true</property>

在hibernate配置文件中查看是否存在多余的SQL语句,

第四:

直接在SQL命令行中尝试插入。也许您的数据库速度不快。

答案 1 :(得分:-1)

如果您要保存10000条记录,则不应该一次执行一条记录。创建一个proc来执行基于集合的插入或更新,而不是使用n_Hibernate。