Java 休眠关系映射/加速批插入
我有5个MySQL InnoDB表:Java 休眠关系映射/加速批插入,java,mysql,performance,hibernate,orm,Java,Mysql,Performance,Hibernate,Orm,我有5个MySQL InnoDB表:Test、InputVoice、InputLine、OutputVoice、OutputLine,每个表都在Hibernate中映射和运行。我已经使用了无状态会话/会话和JDBC批处理大小。为了让MySQL处理id生成,我删除了所有生成器类,但它的执行速度仍然很慢。 这些表中的每一个都用java类表示,并相应地映射到hibernate中。当前,当需要写出数据时,我循环遍历对象并执行session.save(Object)或session.insert(Obje
Test、InputVoice、InputLine、OutputVoice、OutputLine
,每个表都在Hibernate中映射和运行。我已经使用了无状态会话/会话和JDBC批处理大小。为了让MySQL处理id生成,我删除了所有生成器类,但它的执行速度仍然很慢。
这些表中的每一个都用java类表示,并相应地映射到hibernate中。当前,当需要写出数据时,我循环遍历对象并执行session.save(Object)
或session.insert(Object)
(如果我使用的是无状态会话)。当我的行数达到最大jdbc批处理大小(50)时,我也会进行刷新和清除(在使用会话时)
会话。save(master)
,而不是每一个,会更快吗ID生成策略对于Hibernate中的批插入至关重要。特别是,身份生成通常不起作用(请注意,自动通常也映射到身份)。这是因为在批插入过程中,Hibernate有一个名为“RequiredimmediatedAccess”的标志,表示是否立即需要生成的ID;如果是,则禁用批处理 当它说“立即执行标识插入”时,您可以很容易地在调试级日志中发现这一点,这意味着它跳过了批处理,因为它被告知插入后立即需要生成的ID 通常执行的生成策略是表和序列,因为Hibernate可以预生成ID,从而允许批量插入 确定批插入是否有效的一种快速方法是激活调试级日志,因为BatchingBatcher将明确告诉您它正在执行的批大小(“执行批大小:”+batchSize) 此外,以下属性对于实现批插入非常重要。我不敢说它们是必需的,因为我不是足够的Hibernate专家来这样做——也许这只是我的特殊配置——但根据我的经验,它们是必需的:
hibernate.order_inserts = true
hibernate.order_updates = true
这些属性的文档记录得非常糟糕,但我相信它们所做的是使SQL INSERT和UPDATE语句能够正确地分组以进行批处理执行;我想这可能是你想要的多行插入。如果我在这件事上错了,别开枪,我在回忆
我还将继续假设您设置了以下属性:;如果没有,这应作为提醒:
hibernate.jdbc.batch_size = xx
其中xx自然是您所需的批次大小。我的最终解决方案是使用voetsjoeba的响应作为起点。 我的hibernate配置使用以下选项:
hibernate.order_inserts = true
hibernate.order_updates = true
- 我从使用
会话更改为
无状态会话
- 重新订购 处理所有元素的Java代码 在批处理中,一次创建一个表。那么全部 先是表x,然后是表y,等等
- 已从每个文件中删除
班级。Java现在创建了它,并且 将其指定给对象 - 创建的逻辑允许我确定 正在设置id,但未写入 数据库的“空”行
- 最后,我打开了
我的班级在冬眠 类似这样的定义:dynamic insert