持久保存具有良好性能的分层数据集合

时间:2017-04-04 19:33:28

标签: java sql database performance persistence

在我的特定情况下,我使用java,jdbcTemplate和HSQLDB数据库,但我认为这可以被视为关于数据库持久性的一般性问题。

让我们说我有一群人。每个人都可以是其他人的父母,也可以是其他人的孩子。假设每个人可以拥有多个地址,以及多个属性,如身高,体重和眼睛颜色。

所以我们有以下表格。

地址(带参考人员表)

属性(带有对人员表的引用)

关系(两个引用返回人员表,一个代表父母,一个代表孩子)

让我们说我的应用程序中需要保留大量的人员。

以良好的性能保存这些数据有哪些好的模式?

显然,每个人一次坚持一个人会很慢。

下一个选项是将所有人员,他们所有的地址,属性和关系收集到他们自己的单独集合中,并分批存储。

然而,这就是我现在陷入困境的地方。

我正在使用数据库生成的序列ID。

如果我先批量坚持所有人,我如何让人员ID保留这些人的所有地址,属性和关系?

我应该切换到在我的应用程序代码中生成ID,如果是,那么最佳做法是什么?

或者我应该以某种方式使用应用程序代码中已知的其他密钥来引用所需的人员。就像这个人的名字+姓氏栏......

还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

你计划做事的方式是行不通的。

您似乎有点耦合到数据库,因为您有数据库发出您的ID,但您似乎也将所有数据都存储在内存中,并且需要一次性将所有内容保存到数据库中。这两种操作模式彼此不兼容。

通常这样做的方法是通过与数据库完全集成,或者根本不使用数据库。

  • 与数据库完全集成意味着使用像Hibernate这样的对象关系映射(ORM)框架,可能通过JPA。你真的应该读一下这两个。这样,您就不会将所有数据保存在内存中,因此不会出现如何一次性保留大量数据的性能问题。

  • 要完全不使用数据库,请在应用程序关闭之前将所有数据流式传输到XML文件中,并在应用程序启动时从同一XML文件中流式传输数据。阅读JAXB,了解如何实现这一目标。

答案 1 :(得分:0)

  

我正在使用数据库生成的序列ID。

使用多个服务器时,您需要ID的DB(或一些复杂的分布式同步)。您仍然可以从数据库中获取ID并手动分配。为了有效地执行此操作,您可以使用hi-lo算法(或更好:pooled)。

  

如果我首先坚持所有人员,我如何让人员ID保留这些人的所有地址,属性和关系?

不知道,如何做到这一点。 Hibernate可以做到这一点肯定是可能的。自己分配ID可能更简单。

  

或者我应该以某种方式使用应用程序代码中已知的不同密钥来引用所需的人员。就像这个人的名字+姓氏栏......

这可能会变得复杂,可能无法正常工作。当名字和姓氏不唯一时的情况很常见。