2

早些时候,我试图让批量插入在 Hibernate 中工作。我尝试了一切:对于配置,我设置了 batch_size(50)、order_inserts(true)、order_updates(true)、use_second_level_cache(false)、use_query_cache(false)。对于我使用的会话setCacheMode(CacheMode.IGNORE)setFlushMode(FlushMode.MANUAL). MySQL 查询日志仍然显示每个插入都是单独进入的。

唯一有效的是rewriteBatchedStatements=true在 JBDC 连接字符串中设置。这让我很担心,因为我的应用程序应该支持任何 JBDC 数据库,而我正试图避免特定于数据库的优化。

hibernate实际上不能使用批处理语句的唯一原因是因为MySQL驱动程序默认不支持它们吗?那么其他驱动程序呢,我是否必须向连接字符串添加选项,以便它们可以支持批量插入?如果您需要特定的数据库,请考虑 SQL server、sqlite、Postgres 等

4

2 回答 2

2

它无法工作的一个原因是,如果您使用Identityid 生成策略,hibernate 会禁用批处理。

此外,在不打开重写选项的情况下,MySQL 不像其他数据库那样支持 JDBC 批处理准备语句。

我不认为打开这个标志是个问题,如果你正在为不同的数据库设置你的应用程序,你将不得不更改诸如方言、驱动程序名称等设置,因为这是一部分的 JDBC 连接字符串,那么您将与配置隔离。

基本上我认为你在做正确的事。

于 2013-03-22T07:27:23.907 回答
0

由于批量插入(或批量插入)是 SQL 标准的一部分,因此像 Hibernate 这样的 ORM 框架支持并实现它。请参阅第 13 章。批处理Hibernate/MySQL 批量插入问题

基本上,您需要通过命名的变量将 JDBC 批处理大小设置为hibernate.jdbc.batch_size合理的大小。也不要忘记用flush()and结束批处理事务clear()

于 2013-03-25T10:06:58.700 回答