2016-05-31 65 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相同。 我很樂意幫助你,很快我會分享一個示例應用程序 –

相關問題