2016-05-31 66 views
2

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

两个问题:

1)这对存档旧数据是个好主意,但还是离开它可查询? 2)Spring-JPA使用分区表吗?或者我们必须弄清楚如何分解查询并执行原生查询并连接restult集?

谢谢。

回答

1

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

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

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

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

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

2)Spring-JPA使用分区表吗?或者我们必须弄清楚如何分解查询并执行原生查询并连接restult集?

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

注:问题与分区表

你将与分区表中所面临的唯一问题是插入分区表。

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

当您尝试使用Spring JPA插入行或Hibernate,您将面临跌破发行

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

要解决此问题,您需要覆盖批量配料器的实施。

在冬眠则可以使用以下的配置

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

在弹簧JPA提供配料工厂的自定义实现您可以通过使用以下配置自定义实施批量生成器来实现相同的目标

hibernate.jdbc.batch.builder = path.to.my.batch.builder.implem entation

+2

柜面你需要实现自己的自定义配料你可以参考我的博客https://anilagrawal038.wordpress.com/2016/12/11/custom-batch-builderbatch-in-spring-jpa/ –

+0

谢谢@Anil。您是否成功使用此实现对Postgres DB?如果您有一个使用您提出的解决方案的小型工作应用程序,那就太棒了。 – pastafarian

+0

@pastafarian是的,我已经实施了与Postgres DB相同。 我很乐意帮助你,很快我会分享一个示例应用程序 –

相关问题