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

pas*_*ian 3 postgresql partitioning spring-data spring-data-jpa spring-boot

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

两个问题:

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

谢谢。

Ani*_*wal 5

我在一段时间内使用Hibernate和Spring JPA进行postgres分区。因此,我认为,我可以尝试回答您的问题。

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

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

您也可以在postgres中使用聚簇索引功能,以更快地获取数据。

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

2)Spring-JPA是否可以用于分区表?还是我们必须弄清楚如何分解查询,进行本机查询并连接restult集?

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

注意:分区表问题

您将面对分区表的唯一问题是在分区表中插入。

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

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

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

要解决此问题,您需要重写Batching batcher的实现。

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

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

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

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

参考文献

  • 如果您需要实施自己的自定义批处理,可以参考我的博客https://anilagrawal038.wordpress.com/2016/12/11/custom-batch-builderbatch-in-spring-jpa/ (2认同)