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可能會更簡單。

或者我應該以某種方式引用所需人員使用應用程序代碼中已知的其他密鑰。像人名+姓氏列...

這可能會變得複雜,可能無法正常工作。第一個和最後一個名字不唯一的情況很常見。