Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠不批处理插入_Java_Postgresql_Hibernate_Spring Data_Timescaledb - Fatal编程技术网

Java 休眠不批处理插入

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

我希望你能帮我解决这个问题,因为我现在真的不懂,而且到目前为止,所有相关的问题都帮不了我

我有一个实体集合,我想通过spring data saveAll()批量插入TimescaleDB(Postgresql的扩展),我想我已经按照书中的说明配置了所有内容,但hibernate统计数据从来没有反映批量插入:

1223268纳秒用于获取1个JDBC连接

释放0个JDBC连接花费0纳秒

34076442411纳秒用于执行3408条JDBC语句

执行0个JDBC批处理花费0纳秒

我的Hibernate属性通过HibernatePropertiesCustomizer进行如下配置:

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&currentSchema=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。