【问题标题】:Hibernate - Slow batch insertHibernate - 慢批量插入
【发布时间】:2015-07-03 06:12:27
【问题描述】:

以下是我批量插入 MySQL 远程数据库的代码。

    Session session = db.setSession();
    Transaction tx = session.beginTransaction();

    for ( int i=0; i<e.getContents().size(); i++ ) {
        Content content = e.getContents().get(i);
        session.save(content);
        if ( i % 40 == 0 ) { 
            session.flush();
            session.clear();
        }
    }
    tx.commit();

映射定义如下:

class name="Database.Content" table="..." schema="" catalog="...">
    <id name="id">
        <column name="id" sql-type="int" not-null="true"/>
        <generator class="identity"/>
    </id>
    <property name="week">
        <column name="week" sql-type="int"/>
    </property>
    <property name="type">
        <column name="type" sql-type="int" not-null="true"/>
    </property>
    <many-to-one name="group" class="Database.Group">
        <column name="`group`"/>
    </many-to-one>
    <many-to-one name="table" class="Database.Table">
        <column name="`table`" not-null="true"/>
    </many-to-one>
</class>

我还在hibernate.cfg.xml中设置了一些属性:

<property name="hibernate.jdbc.batch_size">40</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

很遗憾,插入 150 行大约需要 30 秒,非常慢。我已阅读设置 generator=identity 可能会完全禁用批量插入。但是,如果我删除 generator 行,我最终会收到 Duplicate key 错误。我想知道我是否可以将null 作为我的id 发送,这样MySQL 就可以完成这项工作。

优化查询的最佳方法是什么?谢谢。

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    正如SO question identity 中的回答,确实不适用于批处理。对于 MySQL,您最终要么在应用程序中生成 id(例如,使用生成器 assigneduuid - Hibernate-specific),要么使用符合 JPA 的 table 生成器。

    表格生成器使用示例:

    <table-generator name="EMP_GEN"
            table="GENERATOR_TABLE"
            pk-column-name="key"
            value-column-name="hi"
            pk-column-value="EMP"
            allocation-size="20"/>
    

    查看http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#mapping-declaration-id 的详细信息。 Java EE page上也有说明参数是什么意思。

    【讨论】:

    • 谢谢!我如何准确定义table 生成器,因为没有
    • 这取决于您使用的 Hibernate 版本。对于 Hibernate 5.0 it's donetable-generator 元素。
    • 我使用的是 Hibernate 4.3.8
    • 添加了使用表生成器的示例
    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 2011-02-15
    • 2016-05-22
    • 2012-02-16
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多