2017-04-04 52 views
0

在我的特殊情况下,我正在使用java,jdbcTemplate和HSQLDB数据库,但我认为这可以看作是关于数据库持久性的通用问题。持续收集性能良好的分层数据

可以说我有一个人的集合。每个人都可以成为其他人的父母,成为其他人的孩子。假设每个人都可以拥有多个地址和多个属性,例如身高,体重和眼睛颜色。

所以我们有以下表格。

地址(与基准回人表)

属性(与基准回人表)

关系(有两个参考回到人一桌,一对父母,一个给孩子)

并且可以说我有一大堆人需要在我的应用程序中坚持。

坚持这些数据的良好表现是什么?

明显地坚持每个人一个一个会慢。

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

但是,这是我现在卡在哪里。

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

如果我先把所有的人都留在一个批次中,那么我如何获得这些人员ID来坚持这些人的所有地址,属性和关系?

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

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

还有其他方法吗?

回答

0

你打算做事情的方式是行不通的。

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

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

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

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

+0

嘿,谢谢你的回复。 1)相信与否我最初是从Hibernate开始解决问题的,但后来因为想要更细化的控制以及缺乏理解而放弃了,因此我一定会考虑再次使用它在手之前完成更多的阅读。 2)基于文件的持久性对我来说不会有效,除了我更喜欢JSON:P 3)你为什么说它不可行? Hibernate不会解决我在幕后描述的问题吗? Hibernate如何解决它? – user1066113

0

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

当使用多个服务器时,您需要用于该ID的数据库(或一些复杂的分布式同步)。不过,您可以从数据库获取ID并手动分配。为了有效地做到这一点,您可以使用hi-lo算法(或更好:pooled)。

如果我先坚持所有的人成批,那么我如何获得人员ID来坚持这些人的所有地址,属性和关系?

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

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

这可能会变得复杂,可能无法正常工作。第一个和最后一个名字不唯一的情况很常见。