Spring-JPA 可以与 Postgres 分区一起使用吗?

Posted

技术标签:

【中文标题】Spring-JPA 可以与 Postgres 分区一起使用吗?【英文标题】:Can Spring-JPA work with Postgres partitioning? 【发布时间】:2016-09-29 22:20:35 【问题描述】:

我们有一个使用 Spring-JPA 进行数据访问的 Spring Boot 项目。我们有几个表,我们在其中创建/更新一次(或几次,都在几分钟内)。我们不会更新超过一天的行。这些表(如审计表)可能会变得非常大,我们希望使用 Postgres 的表分区功能来帮助按月分解数据。所以主表总是有这个日历月的数据,但如果查询需要从前几个月检索,它会以某种方式从其他分区读取它。

两个问题:

1) 这是归档旧数据但仍可查询的好主意吗? 2) Spring-JPA 是否适用于分区表?还是我们必须弄清楚如何分解查询并进行本地查询并连接结果集?

谢谢。

【问题讨论】:

【参考方案1】:

我正在使用 Hibernate 和 Spring JPA 进行 postgres 分区一段时间。所以我想,我可以试着回答你的问题。

1) 这是归档旧数据但仍可查询的好主意吗?

如果您正在应用索引而不是频繁地重新索引表,那么数据分区可能会导致更快的查询结果。

您还可以在 postgres 中使用聚集索引功能来更快地获取数据。

因为旧数据的表不会被更新,所以聚集索引会有效地提高性能。

2) Spring-JPA 是否适用于分区表?还是我们必须弄清楚如何分解查询并进行本地查询并连接结果集?

Spring JPA 可以开箱即用地使用分区表。它将从主表和子表中检索数据并返回连接的结果集。

注意:分区表的问题

使用分区表您将面临的唯一问题是插入分区表。

让我解释一下,当您对表进行分区时,您将在主表上创建一个触发器,该触发器将返回 null。这是使用 Spring JPA / Hibernate 在分区表中插入问题的关键。

当您尝试使用 Spring JPA 或 Hibernate 插入一行时,您将面临以下问题

批量更新从更新 [0] 返回了意外的行数;实际行数:0;预计:1

要克服这个问题,您需要重写 Batching 批处理器的实现。

在休眠中,您可以使用以下配置提供批处理器工厂的自定义实现

hibernate.jdbc.factory_class=path.to.my.batcher.factory.implementation

在 Spring JPA 中,您可以使用以下配置通过自定义实现批处理生成器来实现相同的目的

hibernate.jdbc.batch.builder=path.to.my.batch.builder.implementation

参考文献

Custom Batch Builder/Batch in Spring-JPA Demo Application

【讨论】:

如果您需要实现自己的自定义批处理,可以参考我的博客anilagrawal038.wordpress.com/2016/12/11/… 谢谢@Anil。您是否成功地针对 Postgres DB 使用了这个实现?如果您有一个使用您提出的解决方案的小型工作应用程序,那就太棒了。 @pastafarian 是的,我已经用 Postgres DB 实现了相同的功能。我很乐意为您提供帮助,稍后我将分享一个示例应用 这里正在为同一个github.com/anil-agrawal/spring-jpa-partitioning运行项目 我没有时间探索更多关于 nw 变化的信息,但我可以看到 BatchingBatch 也在扩展 AbstractBatchImpl。 docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/engine/…【参考方案2】:

除了@Anil Agrawal 的回答。

如果您使用的是 spring boot 2,那么您需要使用该属性定义 customBatcher。

spring.jpa.properties.hibernate.jdbc.batch.builder=net.xyz.jdbc.CustomBatchBuilder

【讨论】:

以上是关于Spring-JPA 可以与 Postgres 分区一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

spring-jpa:PropertyReferenceException:没有找到类型 [PerfectionTask] 的属性 [保存]

spring-jpa规格工具

如何添加到列表的链接以使用 spring-jpa 进行排序?

spring-jpa通过自定义sql执行修改碰到的问题

如何使 postgres 避免对此搜索分页查询进行双重顺序扫描?

如何在 Postgres 中使用带有多个分位数的 percentile_conts