將 H2 作為生產資料庫進行評估
1. 概述
H2 是一種非常受歡迎的資料庫解決方案,尤其是在測試方面。它首先作為記憶體資料庫引入,用於測試和整合環境,**因為它易於設定和使用**。它也被證明可靠且快速,因此對於配置緩慢且部署成本高昂的傳統資料庫來說,它是一個非常好的替代方案。
隨著時間的推移,H2 開始支援磁碟儲存以及伺服器模式。這樣,它就成為長期持久性儲存的選項,也成為分散式系統的可能資料庫,因為不同的服務和/或伺服器可以以伺服器模式存取它。因此,開發人員開始考慮將 H2 作為儲存的另一種選擇,即使在生產環境中也是如此。
在本教程中,我們將介紹使 H2 成為生產儲存選項的功能、仍然存在的限制,並將評估 H2 可用於生產的情況以及我們應該避免的其他情況。
2.H2特點
我們首先來看看H2 的一些特性,這些特性使其成為快速且易於使用的資料庫解決方案:
- 它有一個非常快速的資料庫引擎
- 很容易配置,尤其是在 Spring Boot 應用程式中
- 支援標準SQL和JDBC API
- 提供安全性,具有身份驗證、加密功能等
- 使用事務和兩階段提交
- 允許多個連接和行級鎖定
- 它是開源的並且用 Java 編寫
- 提供 Web 控制台應用程式
最重要的是,H2支援不同的連接模式:
- 嵌入模式,用於本地連接,使用 JDBC
- 伺服器模式,用於遠端連接,使用 TCP/IP 上的 JDBC 或 ODBC
- 以及混合模式,結合了先前的兩種模式
2.1.在記憶中
H2 提供記憶體儲存。在某些情況下,例如快取和遊戲,我們不需要保留數據,可以使用記憶體資料庫。 Redis是一種非常流行的記憶體快取解決方案,廣泛應用於生產環境中。
因此,在現代應用程式中,一個服務可以使用多個資料庫,我們可以同時使用持久性資料庫和記憶體資料庫來提高效能。如果我們考慮到 H2 作為一個具有嵌入式模式選項的 Java 資料庫的速度有多快,那麼我們就可以理解為什麼人們越來越多地在生產中使用它。
2.2.磁碟儲存
當談論資料庫時,人們默認認為資料是持久化的。資料庫最初是為了儲存資料並提供持久性而發明的。在絕大多數情況下,我們不希望在資料庫關閉或重新啟動時遺失資料。
隨著時間的推移,對 H2 支援某些持久性的請求也越來越多。在以後的版本中, H2增加了磁碟儲存支持,可以用於持久化資料。在這種模式下,資料儲存在主機的檔案中。因此,當資料庫關閉時,資料將保留以供重新啟動時使用。
2.3.嵌入模式
在嵌入式模式下,資料庫和應用程式將在同一個JVM中執行。這是最快、最簡單的 H2 模式。應用程式可以使用 JDBC 連接到資料庫。但該虛擬機器之外的其他應用程式/伺服器無法存取它。
在這種模式下,持久化和記憶化都是可能的。此外,同時開啟的資料庫或連線沒有限制。
如果我們的生產環境有多台伺服器共享同一個資料庫,那麼顯然這種模式不能使用。對於只有一台伺服器的小型應用程序,嵌入式模式可能是一種選擇,特別是考慮到過去幾年在生產中 SQLite 等資料庫的使用不斷增長。
2.4.伺服器/混合模式
在伺服器模式下,應用程式在相同或不同的虛擬或實體機中遠端開啟資料庫。我們可能會看到它也稱為遠端模式或伺服器/客戶端模式。然後,一個或多個應用程式可以使用基於 TCP/IP 的 JDBC 或 ODBC 連接到 H2。
這種模式速度較慢,因為我們使用 TCP/IP,但允許更多電腦連接到相同資料庫。與嵌入式模式相同,支援記憶體中和持久性,並且對開啟的資料庫或連線沒有限制。
混合模式是嵌入式模式和伺服器模式的結合。一個應用程式以嵌入模式運行,但它也會啟動一台伺服器。其他應用程式可以使用該伺服器遠端連接到資料庫。
使用伺服器或混合模式,當我們需要支援多個伺服器連接到相同資料庫時,我們可以在生產中使用H2資料庫。
3. 為什麼H2是合適的生產解決方案?
從目前我們所看到的情況來看,我們可以說 H2 是一個非常快速且易於使用的資料庫,當在嵌入式模式下使用時,具有記憶體儲存。與傳統資料庫相比,任何對速度的需求比對持久性的需求更重要的應用程式都可以從 H2 中受益。
在其他模式下,與其他資料庫相比,它仍然是一個可靠的解決方案,因為:
- 它有一個非常快速的引擎
- 它非常易於使用和配置(對於 Java 應用程序,這可能意味著只需添加依賴項和一些屬性)
- 它支援集群,提供耐用性並且沒有單點故障
- 由於它是開源的,因此非常便宜
- 非常容易學習和使用
總的來說,**當我們不需要太多 TPS 或大數據量時,H2 是一種簡單、容易的生產解決方案**。此外,在生產中使用過它的人報告說,它非常適合應用程式內部,例如快取、保留短期資料、加載快速存取所需的資料以提高效能等(就像 SQLite 主要用於的用途) 。
4. 為什麼 H2 不是合適的生產解決方案?
在某些情況下,H2 可能不是生產資料庫的最佳選擇。從設計上來說,它有一些明顯的限制。但也有關於其性能的報導。 H2 最近被不同的(通常是小型的)應用程式用於生產環境,並且有其實際性能的 PoC。
從限制開始,在任何模式下,H2 在處理儲存和讀取大物件時都會遇到困難。如果物件不適合內存,可以使用 BLOB 和 CLOB 類型,但這會增加複雜性和效能。
可用性、可擴展性和持久性也是問題,因為 H2 叢集目前只能支援叢集中最多兩個節點。這意味著對於高可用性服務,它不是在生產中使用的選項。儲存關鍵數據也是如此,因為當最多只有兩台伺服器啟動和運行時,耐用性可能會受到影響。
此外,在持久性方面,如H2 文件中所述,該資料庫無法保證所有已提交的交易在電源故障後仍能倖存下來。
閱讀在生產中使用 H2 的人的報告和文章,普遍的結論是,目前,對於具有實際數據大小的真實應用程序,H2 並不可靠。即使它可以處理大小,它也會導致錯誤,有時甚至會導致資料遺失。特別是在多執行緒/多連接用例中,用戶遇到了很多問題,包括資料成長時的死鎖和效能不佳。
一些較小的限制是**H2 沒有商業支持,而且它的功能比其他傳統資料庫少**。在記憶體使用的情況下,我們應該考慮額外的成本,因為記憶體比磁碟空間更昂貴。
5. 結論
在本文中,我們研究了 H2 資料庫的主要功能,並重點介紹了使其成為生產儲存選項的模式。然後,我們討論了它的優點和限制。
總之,如果我們不需要處理大量數據和高交易率,H2 非常適合生產。當需要一台生產伺服器並且 H2 可以在嵌入式模式下使用時尤其如此。另一方面,當我們需要高可用性或可擴展性或面臨高資料量時,我們應該避免它。