2012-05-29 17 views
0

您好我有一个应用程序,其中一个时间请求带有一个数组我必须从表中选择数据,如果没有找到生成新值并插入到表中,然后再次循环检查下一个值的统计信息等等。对于新的请求,这将完成大约50000次。休眠提交后,每次转换使其缓慢

我使用

public void save(Object obj,Session session) {  

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

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

      if(tx!=null){ 
       tx.rollback(); 
      } 
     } 
} 

方法来提交,它被称为对于每个新值generated.like对于每个请求它被称为50000次。 我必须为每个值提交事务,因为我不希望在表中生成重复值,所以如果新请求带有相同数据并且前一个正在运行,则应从表中提取该值。所以我认为我将不得不提交每个事务。但是,如果我使用传统的JDBC而不是休眠,这会变得相当快?我做错了什么是冬眠比较慢?因为我认为大部分时间都是在开始时被消耗并且一次又一次地进行交易。

+0

我对此的理解相当有限,但为每个请求开放50000个新会话几乎都不是您想要做的事情。我建议将所有值保存为批处理。如果你担心重复,hashmap可能可以解决这个问题,但如果没有关于你的情况的更多信息,很难猜测。 – Tharwen

+0

但会话只打开一次。开始和提交被称为大约50000次。 – Harinder

+0

好的,但你为什么要单独保存每个项目? – Tharwen

回答

3

你在做什么是批处理

一些想法

  • 化妆交易更大的(跨比1插入更多)
  • 使用乐观锁:重试,如果发生了冲突
  • 配置JDBC批量

为了避免重复插入,添加一个额外的列,其中包含自然键并具有唯一约束。

+0

,我不能使用批处理,我已经提到的问题的原因,如果另一个线程进来,我也使用身份,所以批处理被禁用 – Harinder

+0

查看更新的答案。识别条目的自然秘诀是什么? – ewernli

+0

http://en.m.wikipedia.org/wiki/Natural_key – ewernli