我无法让 Hibernate 在 MySQL 上执行批量插入。
我正在使用 Hibernate 3.3 和 MySQL 5.1
在高层次上,这就是正在发生的事情:
@Transactional
public Set<Long> doUpdate(Project project, IRepository externalSource) {
List<IEntity> entities = externalSource.loadEntites();
buildEntities(entities, project);
persistEntities(project);
}
public void persistEntities(Project project) {
projectDAO.update(project);
}
这会产生 n 个日志条目(每行 1 个),如下所示:
Hibernate: insert into ProjectEntity (name, parent_id, path, project_id, state, type) values (?, ?, ?, ?, ?, ?)
我希望看到它被分批处理,这样更新的性能会更高。此例程可能会导致生成数万行,并且每行一次数据库访问是致命的。
为什么不进行批处理? (据我了解,在适当的情况下,hibernate 应该默认批量插入)。
最佳答案
Pascal 的回答是正确的。但是,由于您使用的是 MySQL,我也强烈建议您尝试在 JDBC URL 中使用 rewriteBatchedStatements=true
参数。
此参数导致 JDBC 驱动程序动态重写您的 INSERT 批处理以使用单个“多值”INSERT,例如:
INSERT INTO mytable (mycol) VALUES (0);
INSERT INTO mytable (mycol) VALUES (1);
INSERT INTO mytable (mycol) VALUES (2);
将被重写为:
INSERT INTO mytable (mycol) VALUES (0), VALUES (1), VALUES (2);
在某些情况下,这可能会产生重大影响。参见 http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for对于一些示例测量。
关于java - Hibernate/MySQL 批量插入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303152/