2012-05-21 2 views
0

Привет, у меня есть приложение, в котором я сначала проверяю значение в таблице БД, если он не генерирует новое значение и вставляет его в БД, этот цикл проходит миллион раз, как я могу ускорить его?Вызов вставки несколько раз в спящий режим?

в моем рабочем классе: -

session=HibernateSessionFactory.getSession();  
    for(----loop 

    i check 

    i generate 

    then:- 

    MyTable myTable=new MyTable(); 
      myTable.setName("dasdas"); 
      myTable.setww("ss"); 
      myTable.setaa("daaasdas"); 

    hibernateRepositoy.save(dgCcno,session); 

} 

сохранить метод я другой класс: -

public void save(Object obj,Session session) {  

      Transaction tx = null; 
      try { 
       tx = session.beginTransaction(); 
       session.saveOrUpdate(obj); 
       session.flush(); 

       session.clear(); 
       tx.commit(); 
      } 
      catch (HibernateException e) { 
       e.printStackTrace(); 
       logger.error(e.getMessage(), e);    

       if(tx!=null){ 
        tx.rollback(); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 

       logger.error(e.getMessage(), e);   

      } 
     } 

как я могу ускорить это, или это правильный подход?

Добавлено: - я не могу использовать пакетное обновление, я должен вставить значение сразу, вызывают значения в следующем запросе выборки может быть такой же .. и должны дать значение из БД затем

+0

Вы можете использовать пакет гибернации. Подробнее см. Http://stackoverflow.com/questions/8972853/hibernate-batch-insert-batch-update. – tibtof

+0

@tibtof no i can not, мне нужно сразу вставить значение, потому что значения в следующем запросе выбора могут быть одинаковыми .. и должны дать значение из БД, а затем – Harinder

+0

вам нужно немедленно зафиксировать? Я думаю, что если вы используете только одну транзакцию, это будет намного быстрее. – tibtof

ответ

6
  • не использует одну транзакции для каждой строки, но включает в себя все (или, по крайней мере, значительных подмножества) в одной транзакции
  • вопроса один запрос, чтобы проверить наличие нескольких строк сразу
  • следовать advices of the reference documentation
+0

plz проверить обновленный вопрос , я должен сразу вставить значения. – Harinder

+1

В данной транзакции все, что вы вставили, видимо для этой транзакции. Таким образом, вы можете выполнить следующий запрос, и он найдет вашу вставленную строку, даже если транзакция не будет выполнена. Важно только то, что сеанс должен быть очищен. Но Hibernate достаточно умен, чтобы автоматически очистить его до выполнения запроса. –

+0

Я просто попробую его, так что скажите мне, есть ли предел объектов, которые я могу сохранить, прежде чем позвонить tx.commit(). например, если мне нужно сэкономить около 1 миллиона записей? – Harinder