java - 每个事务后 Hibernate 提交会导致速度变慢

标签 java hibernate

嗨,我有一个应用程序,其中当请求带有一个数组时,我必须从表中选择数据,如果找不到,则生成新值并插入到表中,然后再次循环统计检查下一个值等等。对于新请求,此操作将执行大约 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();
            }
        } 
}

提交方法,并为每个生成的新值调用它。就像每个请求它被调用 50000 次一样。 我必须为每个值提交事务,因为我不希望在表中生成重复的值,因此如果新请求带有相同的数据并且前一个请求正在运行,则应从表中获取该值。所以我想我必须提交每个事务..但是如果我使用经典的 JDBC 而不是 hibernate ,这会变得相当快,所以呢?我做错了什么吗,与它相比, hibernate 速度很慢吗?因为我认为大部分时间都消耗在一次又一次开始和提交事务上。

最佳答案

您正在做的是批处理

一些想法

  • 使事务规模更大(跨度超过 1 个插入)
  • 使用乐观锁定:如果发生冲突则重试
  • 配置 JDBC 批量大小

为了避免重复插入,请添加一个额外的列来保存自然键并具有唯一约束。

关于java - 每个事务后 Hibernate 提交会导致速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794788/

相关文章:

java - 将 JScrollPane 添加到 JDialog

hibernate - 如何在grails中使用executeQuery()进行多态查询?

java - Hsqldb - 从存储过程返回结果集

java - org.hibernate.LazyInitializationException : could not initialize proxy - no Session . 对于测试用例 JUnit

Java 线程 : interpreting thread states of a running JVM

java - 格式化字符串输出

java - 为什么我收到 NullPointerException

java - 如何在hibernate java中的createSQLQuery中使用ilike和%

java - 我如何知道 Hibernate .list() 方法中的返回值是数组还是标量?

java - 如何在 eclipse 中为 jar 附加 javadoc?