Java 休眠不批处理插入
我希望你能帮我解决这个问题,因为我现在真的不懂,而且到目前为止,所有相关的问题都帮不了我 我有一个实体集合,我想通过spring data saveAll()批量插入TimescaleDB(Postgresql的扩展),我想我已经按照书中的说明配置了所有内容,但hibernate统计数据从来没有反映批量插入: 1223268纳秒用于获取1个JDBC连接 释放0个JDBC连接花费0纳秒 34076442411纳秒用于执行3408条JDBC语句 执行0个JDBC批处理花费0纳秒 我的Hibernate属性通过HibernatePropertiesCustomizer进行如下配置:Java 休眠不批处理插入,java,postgresql,hibernate,spring-data,timescaledb,Java,Postgresql,Hibernate,Spring Data,Timescaledb,我希望你能帮我解决这个问题,因为我现在真的不懂,而且到目前为止,所有相关的问题都帮不了我 我有一个实体集合,我想通过spring data saveAll()批量插入TimescaleDB(Postgresql的扩展),我想我已经按照书中的说明配置了所有内容,但hibernate统计数据从来没有反映批量插入: 1223268纳秒用于获取1个JDBC连接 释放0个JDBC连接花费0纳秒 34076442411纳秒用于执行3408条JDBC语句 执行0个JDBC批处理花费0纳秒 我的Hibernat
props.put("hibernate.generate_statistics", true);
props.put("hibernate.order_inserts", true);
props.put("hibernate.order_updates", true);
props.put("hibernate.jdbc.batch_size", "100");
我通过调用以下命令验证了saveAll()期间确实存在事务上下文:
TransactionSynchronizationManager.isSynchronizationActive()
实体的ID如下所示。没有@GeneratedValue或@SequenceGenerator注释,因为我使用数据的时间戳(来自web API)作为ID
@Id
@Column
private Instant time;
我甚至尝试通过调整连接字符串来控制重写行为,但没有帮助:
jdbc:postgresql://localhost:5432/db?reWriteBatchedInserts=true¤tSchema=finance-data
我用maven org.postgresql 42.2.9和42.2.13驱动程序测试了这一点。
Spring Boot发行版是2.2.2.0版本,它捆绑了hibernate core 5.4.9.FINAL和Spring jdbc 5.2.2.0版本。
时间刻度docker版本为1.7.1-pg12
如果你需要更多的信息,请告诉我。提前感谢 从中,它提到如果手动为批量插入的实体分配ID,则必须添加@Version
属性。但是对于PostgreSQL,如果使用序列
生成器生成ID,则不需要添加@Version
如果添加@Version
可以解决手动分配ID的问题,我不会尝试,但您可以尝试一下。我个人使用SEQUENCE
generator生成ID,它不需要在PostgreSQL中添加@Version
为了在使用SEQUENCE
generator时有效地生成ID,我还改为使用中提到的“poolled”或“poolled lo”算法,以减少获取ID的数据库往返
以下是我的工作:
@实体
公开课Foo{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“foo_SEQUENCE”)
@SequenceGenerator(name=“foo\u sequence”,sequenceName=“foo\u id\u seq”,allocationSize=100)
私人长id;
}
和休眠设置:
hibernate.order_inserts = true
hibernate.order_updates = true
hibernate.jdbc.batch_size = 50
hibernate.jdbc.batch_versioned_data = true
# For using "pool-lo" optimiser for generating ID when using JPA @SequenceGenerator
hibernate.id.optimizer.pooled.preferred = pooled-lo
还需要确保PostreSQL中的序列与@SequenceGenerator
中配置的序列一致:
将序列foo_id_seq增量更改100;
为完整起见,对于PostgreSQL,还可以在JDBC连接字符串中添加
reWriteBatchedInserts=true
,这可以提供2-3倍的性能改进,正如。所说,感谢您的回复,但我不确定这对我有何实际帮助。我肯定不想自己创建ID,也不想让我的数据库来创建,因为我更喜欢使用财务数据时间戳作为PKs,这也是在正式的TimescaleDB示例中完成的。我将修改我的问题,因为我没有提到我对postgresql使用了timescale DB扩展!你仍然可以制作一个id,它是一个代理id,只供内部使用。您仍然可以保留现有的时间戳供客户端使用,这是一种自然密钥/业务密钥。对于客户端,他们不需要知道代理ID,仍然像往常一样使用现有的时间戳作为密钥。hibernate也有@naturaid来映射这样的自然id。