java - 表分区的抽象层 - JPA

标签 java postgresql eclipselink partitioning openjpa

事实

  • 数据库:PostgreSQL(最新)
  • 编程语言:Java

问题陈述(简化)

我们有 2 个表格 - 概述和详细信息。 “概述”中可能有数百万行,“概述”中的每一行在“详细信息”中可能有数百万行与之关联。外键details.overview_id指的是overview.id。大多数查询都是一般形式

SELECT * FROM details WHERE overview_id = xxx AND details.id > yyy AND details.id < zzz;

如果我们只有一张明细表,查询就会太慢(尽管明细查询几乎总是在主键上)。

更多关于明细的本质数据库 Activity :概览上的 INSERT 和 UPDATE 很少发生。对细节的 INSERT 发生得很快,而对同一个表的 UPDATE 几乎不会发生,而批量 DELETE 有时会发生。

我们已经拥有的

过去,我们使用原始 SQL 将表“详细信息”与“概述”中的每一行进行分区。 (实际上,我们并没有真正分区,而是根据模板创建了新表。这些表没有任何名为overview_id的列(节省存储空间),而是我们有一个单独的表,用于在overview.id和特定分区表的表名。)因此,正如您所理解的,分区必须在概览中插入新行时动态生成,并在从概览中删除行时删除分区。所有这些都是在应用程序内部管理的。应用程序与数据库的交互速度非常快,但应用程序代码相当复杂,这意味着很难维护。此外,由于原始 SQL 无处不在,因此很难水平扩展数据库 - 我们必须重新发明大多数 JPA 提供商已经做过的事情。

当前目标

目前,我们正在探索一种机制的选项,通过这种机制,这种分区可以在幕后发生——可能是由 JPA 提供者(我知道这不是 JPA 规范的一部分),这样我们就可以专注于应用程序,而底层框架/层负责解决可扩展性问题。

我查看了 openJPA Slice 和 EclipseLink。它们都提供跨主机的分区(分片)管理。我们当然需要那个。但是我们还需要在单个主机内进行分区管理。然而,如果有更好或更优雅的解决方案,或者有一个完全不同的角度来看待这个问题,我会很高兴知道这一点。

我将不胜感激您提供的任何见解。

谢谢。
普拉杰什

最佳答案

您是否考虑过使用 Postgres 的表分区?

http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

关于java - 表分区的抽象层 - JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617033/

相关文章:

java - 鱼眼中的哪个类/jar 文件 Hook 到 subversion 和 GIT?

java - 我如何获得 Spring Security SessionRegistry?

sql按空格将字符串拆分为postgresql中的表

postgresql - 无法使用Docker Compose与Wordpress建立postgres连接

postgresql - pg_relation_size 告诉我列不存在

java - 使用正则表达式验证输入至少包含 2 个字母,允许特殊字符和普通字符

java - JPA双向@OneToOne与级联合并

java - EclipseLink/JPA : Specify length of byte array

java - 是否可以为 JPA 编写通用枚举转换器?

java - 为序列化设置一个 transient 字段,但为 JPA 设置非 transient 字段