我有完全相同的场景,这就是我最终所做的......
在 persistence.xml/equivalent 文件中使用以下配置
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
您给出的示例是批量插入,上面的配置所做的只是将各个插入语句作为单个批次发送到数据库,它实际上并没有将插入重写到
INSERT INTO MyEntityMap () VALUES (), (), (), (), ()
诚然,批量插入只能带来轻微的性能改进,真正的性能改进可以来自批量插入。
批量插入不是 ANSI SQL 功能,而是单个数据库提供程序的功能,MySQL 数据库连接器驱动程序提供了将批量插入重写为批量插入的配置
要启用它,请使用如下所示的连接字符串
jdbc.url=jdbc:mysql://localhost:3306/macula?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&rewriteBatchedStatements=true
现在,一旦完成此操作,如果您尝试运行该应用程序,并在 mysql 中启用常规查询日志记录,您将看到您的插入被重写为批量插入......但您也会得到一个BatchedTooManyRowsAffectedException:)
这是由org.hibernate.jdbc.Expectations.BasicExpectation.verifyOutcome() http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.6.ga/org/hibernate/jdbc/Expectations.java方法(第 67 行)
由于 hibernate 对重写一无所知,它无法理解更新计数,我找不到合理的方法来挂钩我的 Expectations 类的实现......
这是一种死胡同,我们不能在 hibernate 中使用 rewriteBatchedStatements 功能!
好吧,除非你愿意做一个邪恶的黑客,那就是......只需将类复制粘贴到完全相同的包层次结构下的项目代码中,这意味着 hibernate 将选择你复制粘贴的类,而不是打包在 hibernate jar 中的类,然后注释掉 if 语句...是的,那么一切都会顺利进行!
请仔细考虑上述黑客行为;)