java - Hibernate/MySQL 批量插入问题

标签 java mysql hibernate orm

我无法让 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/

相关文章:

java - 为什么我不能使用 <jsp :getProperty> without <jsp:useBean>?

java - 如何检查你是否仍然使用 jpa 连接到数据库

java - 使用外部 jar 。找不到适用于 jdbc :sqlserver 的合适驱动程序

php - 如何在MySQL数据库中正确插入小数

hibernate - Hibernate递归初始化

java - 没有本地生成的身份值

java ->>> 和 >> 运算符之间的区别

java - 如何使用 BlueJ 和 Wampserver 修复 "java.lang.ClassNotFoundException: com.mysql.jdbc.Driver"

java - 请澄清Observable类中addObserver和deleteObserver的行为?

php - 从 MySQL 表中选择 MAX 数字不起作用 - PHP