【问题标题】:batch insert/update in hibernate mysql在休眠mysql中批量插入/更新
【发布时间】:2015-09-08 06:06:26
【问题描述】:

我们正在使用容器管理事务。应用服务器 JBOSS AS7 。我在休眠配置文件中启用了以下属性

<property name="hibernate.connection.url">jdbc:mysql://localhost/test?rewriteBatchedStatements=true</property> 
<property name="hibernate.jdbc.batch_size" value="20"/> 
<property name="hibernate.order_inserts" value="true"/> 
<property name="hibernate.order_updates" value="true"/> 
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>

并启用如下的日志记录属性

<logger category="org.hibernate.SQL">
    <level name="TRACE"/>
</logger>

我正在向数据库中插入 10 条记录。 在 hibernate.log 中,我可以看到 10 个插入语句,如下所示

org.hibernate.sql insert into test (name,value,date) values (?,?,?) org.hibernate.sql insert into test (name,value,date) values (?,?,?)  

批量插入无效

【问题讨论】:

    标签: mysql hibernate


    【解决方案1】:

    很可能您实际上正在使用批处理;只是 Hibernate 为每个实体实例打印单独的 sql。

    要检查这一点,请启用 org.hibernate 包的 DEBUG 日志级别(如果您想查看绑定变量,请启用 org.hibernate.type 的 TRACE 级别),然后检查日志中是否出现以下短语:

    • 重用批处理语句

    • 执行批量大小

    如果为已执行的批处理大小打印了大于 1 的数字,那么您正在使用批处理。

    特定于 MySQL,为确保 MySQL 驱动程序重写插入语句,请在连接 url 中启用profileSQL 参数,如here 所述。

    注意:如果使用 IDENTITY id 生成器,则 JDBC 批处理为 disabled

    【讨论】:

    • 是的。如上所述,我已启用日志。将批量大小的日志执行为“1”。也没有出现“重用批处理语句”。
    • 还要注意,我们使用的是无状态会话 bean。那么这就是不使用批处理的原因吗?
    • 我没有尝试过有状态会话 bean。在一些博客中发现stateless session bean不支持hibernate的一级和二级缓存,所以每次查询都会发送到数据库中。
    • 应该与此无关。标识符生成策略是IDENTITY吗?
    • 没有。标识符生成器是 TABLE。
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多