【发布时间】: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 就可以完成这项工作。
优化查询的最佳方法是什么?谢谢。
【问题讨论】: