Запись в БД экономит очень много времени в спящем режиме!Почему это? - PullRequest
0 голосов
/ 14 марта 2012

Я записываю время сохранения для 10000 записей, и я не знаю, с какой стати это займет около 40 минут, чтобы сохранить 10000 записей.У меня есть класс, в котором вся основная работа с фабрикой сессий выполнена, а затем я расширяю (наследую это имя класса [DAO (nameofentity)] и запрашиваю getsession, а затем функцию сохранения. Почему, черт возьми, это занимает так много времени?У меня есть инициализатор log4j, он прокручивается вниз, как большой экран.

Вот код базового класса для получения сеанса в спящем режиме.

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 ]

1 голос
/ 14 марта 2012

Первый:

Вы делаете коммит для каждой вставки. Это неэффективно. Определенно более эффективно сделать один коммит для многих вставок.

Второе:

Почему вы обновляете адрес после создания пациента? Возможно, вы создали адрес только раньше. Более эффективно определить адрес как элемент объекта пациента (например, с отношением «многие к одному» или «один к одному») и вставить оба вместе с одним сохранением (использовать каскад) или вставить адрес после терпение. В этом случае hibernate управляет настройкой адреса пользователя.

третий:

Отслеживайте свои операторы SQL с помощью

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

в файле конфигурации hibernate и посмотрите, есть ли лишние операторы SQL,

Четвертое:

Попробуйте вставки непосредственно в командной строке SQL. Возможно, ваша база данных не быстрее.

0 голосов
/ 24 декабря 2013

Если вы собираетесь сохранить 10000 записей, вам не следует делать их по одной за раз.Создайте процедуру для вставки или обновления на основе набора вместо использования n_Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...