三大嵌入式開源數據庫對比,哪款適合你?

      網友投稿 2566 2025-03-31

      【引言】


      最近收到一個調研需求,就是關于Apache Derby的替換研究。由于其最新的發布版本時間為2019年3月11日,已經有超過一年沒有更新了。所以有必要對其進行可行性的替換研究。本文我們就來探索一下這個問題。

      【Apache Derby】

      Apache Derby,以前名稱為IBM Cloudscape,?是Apache軟件基金會開發的關系型數據庫管理系統(RDBMS),它的特點是可以嵌入到Java程序中,用于在線事務處理。它的磁盤空間占用率非常小:?3.5M左右。

      Apache Derby使用的是在Apache 2.0許可證。

      有一段時間,Oracle公司以Java DB的名稱發布了同樣的二進制文件。?但是,2015年6月,Oracle宣布從JDK 9開始不再繼續這樣的發布。

      【官方網站】

      https://db.apache.org/derby/

      【License】

      Apache License 2.0

      【最新發布】

      10.15.1.3?于?2019年3月11日

      【Derby?技術特點】

      Derby嵌入式數據庫引擎

      該技術的核心是Derby數據庫引擎,是一個全功能的關系型嵌入式數據庫引擎,支持JDBC和SQL的API訪問。使用了IBM DB2 SQL語法。

      Derby網絡服務器

      Derby網絡服務器通過提供傳統的客戶端服務器功能,增加了Derby數據庫引擎的覆蓋范圍。其網絡服務器允許客戶機使用標準的DRDA協議通過TCP/IP進行連接。該網絡服務器允許Derby引擎支持網絡化的JDBC、ODBC/CLI、Perl、Derby數據庫引擎。

      嵌入式網絡服務器

      嵌入式數據庫可以被配置為混合服務器或者嵌入式RDBMS。?除了在同一JVM中的客戶端外,還可以接受來自其他客戶端的TCP/IP連接。

      數據庫實用工具

      ij:是一個允許對任何JDBC數據庫執行SQL腳本的工具。

      dblook:?用于Derby數據庫的設計定義進行提取的工具。

      sysinfo:?實用工具,用于顯示版本號和類路徑。

      【SQLite】

      SQLite是一個基于C語言編寫的關系型數據庫管理系統,是一個程序庫。與許多其他的數據庫系統不同,SQLite?并不是一個客戶端服務器數據庫系統,它是被嵌入到終端程序中的。

      SQLite兼容ACID (原子性、一致性、隔離性、耐久性),可以使用大部分的SQL標準,一般遵循PostgreSQL的語法。

      但是,SQLite使用的是動態的、弱類型化的SQL語法,不能保證域的完整性,這就意味著,可以將一個字符串插入到定義為整數的列中。

      SQLite會在適當的情況下嘗試將數據在格式之間進行轉換,在這種情況下,將字符串?"123 "轉換為整數,但不保證這種轉換,如果不能進行這種轉換,則會將數據按原樣存儲。

      SQLite作為嵌入式數據庫軟件,?可以說是部署得最廣泛的數據庫引擎,已經被一些瀏覽器、操作系統和嵌入式系統(如手機)等廣泛使用。

      【官方網站】

      https://sqlite.org/

      【License】

      Public Domain

      【最新發布】

      3.31.1?于?2020年1月27日

      【SQLite?設計思想】

      與客戶端-服務器數據庫管理系統不同,SQLite引擎沒有獨立的進程與應用程序進行通信。

      相反,SQLite庫被鏈接進來成為應用程序程序的一個組成部分。鏈接可以是靜態的,也可以是動態的。

      應用程序可以通過簡單的函數調用來使用SQLite的功能,這樣可以減少數據庫訪問的延遲:

      在單個進程內的函數調用比進程間通信更有效率。

      SQLite將整個數據庫(設計定義、表、索引和數據本身)作為一個單一的跨平臺文件存儲在主機上。它通過在寫入過程中鎖定整個數據庫文件來實現這種簡單的設計。

      SQLite的讀操作可以是多任務的,不過寫操作只能按順序進行。

      由于無服務器的設計,SQLite應用比客戶端-服務器數據庫所需要的配置要少。

      SQLite之所以被稱為zero-conf,是因為它不需要服務管理(如啟動腳本)或基于grant和密碼的訪問控制。

      訪問控制是通過賦予數據庫文件系統本身的文件系統權限來處理的。客戶端-服務器系統中的數據庫使用的是文件系統權限,這種權限只給守護進程提供數據庫文件的訪問權限。

      無服務器設計的另一個含義是,幾個進程可能無法對數據庫文件進行寫入操作。

      在基于服務器的數據庫中,幾個寫入者都會連接到同一個守護進程,而守護進程能夠在內部處理中使用事務鎖。

      SQLite則不得不依賴文件系統鎖。它無法支持同時訪問數據庫的多個進程。

      因此,SQLite并不是寫密集型部署的首選。

      然而,對于簡單的查詢,幾乎沒有什么并發性的查詢,SQLite的性能是很高的,這得益于它的設計思想避免了將數據傳遞給其他進程的開銷。

      SQLite使用PostgreSQL作為參考平臺。

      一個主要的不同是,除了主鍵之外,SQLite不強制執行類型檢查;值的類型是動態的,不受設計定義的嚴格約束。在存儲時,如果數據類型轉換是潛在的可逆的,?那么數據類型轉換可能被觸發)。

      SQLite努力遵循Postel規則。

      【SQLite功能】

      【SQL支持】

      SQLite實現了SQL的大部分SQL-92標準,但也有一些缺失。

      例如,它部分地提供了觸發器功能,不能寫入到視圖。

      雖然它提供了復雜的查詢,但由于它不能修改或刪除列,所以它的ALTER TABLE功能有限。

      【類型系統】

      對于一個與SQL兼容的DBMS來說,SQLite使用了一個不尋常的類型系統。

      它不像大多數SQL數據庫系統那樣給一個列分配類型,而是將類型分配給單個值。

      從語言上來說,它是動態類型化的。

      此外,它的弱類型化方式與Perl一樣:人們可以將字符串插入到整數列中。

      此時,如果列的首選類型是整數的話,SQLite會先嘗試將字符串轉換為整數。

      這增加了列的靈活性,特別是當綁定到動態類型化的腳本語言中時。

      然而,這種技術并不能移植到其他SQL產品中。一個常見的批評是,SQLite的類型系統缺乏其他產品中靜態類型化列所提供的數據完整性機制。

      SQLite網站描述了一種?"嚴格的親和力"的模式,但這個功能模式還沒有被添加進去。

      目前,可以通過像CHECK(typeof(x)='integer')這樣的約束來實現類型強制。

      【主鍵表】

      表通常包括一個隱藏的rowid索引列,它可以提供更快的訪問速度。

      如果數據庫中包含一個Integer?主鍵(Primary Key)列,SQLite通常會通過將其作為rowid的別名來優化,使其內容作為一個嚴格鍵入的64位有符號整數來存儲,并改變其行為,使其變為自動遞增列。

      未來的SQLite的版本可能會包含一個命令來自查一個列是否有類似于rowid的行為,以區分這些列與弱類型的、非自動遞增的整數主鍵。

      【Unicode】

      Unicode功能在SQLite中是可選的。

      【并發性】

      多個計算機進程或線程可以并發訪問同一個數據庫。

      可以并行滿足多個讀訪問。

      寫訪問只能在當前沒有其他訪問的情況下才能進行。

      否則,寫訪問會失敗并返回錯誤代碼,或者可以自動重試,直到可配置的超時結束。

      在處理臨時表時,這種并發訪問的情況會發生變化。在3.7版本中,當開啟了寫前記錄(WAL)啟用并發讀和寫時,這種限制就會放寬。

      【全文搜索】

      SQLite的3.7.4版本首先加入了FTS4(全文搜索)模塊,該模塊的特點是比老版本的FTS3模塊增強了。

      FTS4允許用戶對文檔進行全文搜索,類似于搜索引擎對網頁的搜索方式。

      【無rowid表】

      3.8.2版本增加了對創建無rowid表的支持,這會帶來空間和性能上的改進。

      【表達式支持】

      SQLite的3.8.3版本中增加了對通用表表達式的支持。

      【Json支持】

      2015年,隨著json1的擴展和新的子類型接口,SQLite 3.9版本引入了JSON內容管理。

      【SQLite開發與工具】

      SQLite的代碼由Fossil托管,Fossil是一個分布式版本控制系統,它本身就是建立在SQLite數據庫基礎上的。

      在SQLite的發行版中提供了一個獨立的命令行程序。它可以用來創建數據庫,定義表,插入和更改行,運行查詢和管理SQLite數據庫文件。它本身還可以作為編寫使用SQLite庫的應用程序的參考。

      SQLite在每次發布之前都會使用自動衰退測試。作為一個版本的驗證的一部分,有超過200萬個測試會被運行。從2009年8月10日發布的SQLite 3.6.17版本開始,SQLite版本的分支測試覆蓋率達到100%。

      這些測試和測試線束一部分是公共領域的,另一部分是不公開的。

      【經典用例】

      l??中間件

      n??ADO.NET適配器,最初由Robert Simpson開發,自2010年4月起與SQLite開發人員共同維護。

      n??ODBC驅動由Christian Werner開發并單獨維護,?Werner的ODBC驅動是OpenOffice.org推薦的訪問SQLite的連接方式。

      n??在Windows上,SQLite被稱為COM(ActiveX)封裝器,可在JScript和VBScript等腳本語言中訪問。這為HTML應用程序(HTA)增加了SQLite數據庫的功能。

      l??網絡瀏覽器

      n??瀏覽器Google Chrome、Opera、Safari和Android瀏覽器都允許使用Web SQL數據庫技術在瀏覽器內的SQLite數據庫中存儲信息,并在該數據庫中檢索信息,盡管這種技術正在迅速被淘汰(即將被IndexedDB取代)。

      n??Mozilla Firefox和Mozilla Thunderbird在內部管理的SQLite數據庫中存儲各種配置數據(書簽、cookie、聯系人等)。在Firefox 57版("Firefox Quantum")問世之前,有一個第三方的附加組件,利用支持該功能的代碼提供了一個管理任意SQLite數據庫的用戶界面。

      n??一些第三方插件可以利用JavaScript API來管理SQLite數據庫。

      l??網絡應用框架

      n??Laravel

      n??Bugzilla

      n??Django的默認數據庫管理系統

      n??Drupal

      n??WordPress

      n??Trac

      n??Ruby on Rails的默認數據庫管理系統

      n??web2py

      l??其他應用

      n??Adobe Systems在Adobe Photoshop Lightroom中使用SQLite作為文件數據庫,這是Adobe AIR中的標準數據庫,在Adobe Reader內部也是如此。

      n??Evernote使用SQLite來存儲Windows中的本地數據庫存儲庫。

      n??Skype

      n??服務管理設施,用于Solaris和OpenSolaris操作系統內的服務管理。

      n??Flame(malware)

      n??BMW IDrive衛星導航系統

      l??操作系統

      l??SQLite默認在

      n??黑莓10操作系統

      n??Symbian OS

      n??諾基亞的Maemo

      n??谷歌的Android

      n??Linux?基金會的?MeeGo

      n??LG的webOS

      n??NetBSD

      n??FreeBSD,從2014年1月的10-RELEASE版本開始,被核心包管理系統使用。

      n??illumos

      n??在Oracle Solaris 10中,服務管理設施數據庫被用于啟動序列化。

      n??蘋果公司從Mac OS X 10.4開始,在macOS的Core Data API中采用了它作為一個選項,在Mac OS X 10.4以后的原始實現中,蘋果也采用了它作為管理視頻和歌曲的選項,在iOS中也采用了它作為存儲iPhone上的文本信息的選項。

      n??MorphOS自3.10版本起

      n??Tizen

      n??Windows 10

      【H2】

      H2是一個用Java編寫的關系型數據庫管理系統。它可以嵌入到Java應用程序中,也可以在客戶端-服務器模式下運行。

      它以開放源碼軟件Mozilla Public License 2.0或Eclipse Public License的形式提供。

      【官方網站】

      https://h2database.com/

      【License】

      Eclipse Public License/Mozilla Public License 2.0

      【最新發布】

      1.4.1.20?于?2019年10月14日

      【H2主要功能】

      【API】

      支持SQL(結構化查詢語言)標準的一個子集。

      主要的編程API是SQL和JDBC,?也支持使用PostgreSQL ODBC驅動,其作用類似于PostgreSQL服務器。

      【表格介質】

      它既可以在內存建表,也可以磁盤上的建表。

      表可以是持久的,也可以是臨時的。

      【索引】

      內存表索引類型是哈希表和樹型,

      磁盤表索引類型是b-樹型。

      【事務處理】

      它所有的數據操作都是事務性的。?實現了表級鎖定和多版本并發控制。同時支持2階段提交協議,但沒有實現分布式事務的標準API。

      【安全特性】

      數據庫的安全特性有:

      基于角色的訪問權限,

      密碼使用SHA-256加密,

      數據使用AES或Tiny Encryption Algorithm XTEA加密。

      這些加密特性也可以作為數據庫內部的功能來使用。

      在客戶端-服務器模式下,以及使用控制臺應用程序時,支持SSL/TLS連接。

      【全文搜索】

      它包含兩個全文搜索功能,一個是本地實現,一個是使用Lucene。

      【高可用性】

      它實現了一種簡單的高可用性:

      在客戶端-服務器模式下使用時,數據庫引擎支持熱故障轉移,這通常被稱為集群,但需要在故障后必須手動啟用集群模式才可以。

      【強制參數】

      數據庫通過強制使用參數化語句,支持SQL注入侵入風險的保護。在H2中,這個功能被稱為?"禁用字面符號(disabling literals)"。

      【Google App Engine】

      從1.1.111版本開始,H2內存內數據庫可以在Google App Engine內部運行。

      【H2在斷電情況下面臨的耐久性問題】

      H2文檔詳細解釋了底層硬件特別是電源系統的問題可能會影響耐久性。

      根據H2文檔的介紹,這些問題不僅與數據庫引擎設計有關,還與存儲緩存機制有關。由于存儲設備為了提高速度而使用寫緩存,在斷電的情況下,設備緩存中的數據會丟失。這時,管理員要根據業務需求,評估速度和數據丟失風險之間的共同權衡,必須仔細考慮關鍵服務器的電源和UPS的設計。

      在某些情況下,可以強制使用fsync來進行寫緩存,這樣可以減緩寫入速度,或者客戶可以接受在斷電的情況下帶來的一定數據丟失風險。

      當然使用fsync的效果有限,因為很多硬盤的出廠默認是啟用了寫緩存,在這種情況下,無論是數據庫的設計或設置,還是操作系統級別的命令,都無法完全杜絕突然斷電時數據丟失或不一致的可能性。

      通過操作系統和硬件設置來禁用所有的緩存,以便實時寫入數據,會對性能產生很大的影響,因為當使用旋轉磁盤時,每秒只有100次左右的寫入操作。

      H2文檔詳細描述了在斷電情況下,事務處理的耐久性會受到影響。

      考慮到在突然斷電的情況下保存數據的硬件限制,同時開發人員通常又沒有防止這類損失的有效手段,許多數據庫引擎默認情況下不會為每個提交調用FileDescriptor.sync()或FileChannel.force()或fsync或類似的方法。

      因為它們會顯著降低系統性能,?又不會顯著提高耐久性。

      HSQLDB文檔中參考了類似問題的變通方法。

      微軟知識庫描述了這些問題,如電源故障、寫緩存等對性能和耐久性的影響等等。

      該知識庫也討論了性能和磁盤寫緩存的脆弱性之間的權衡,以及管理員如何設置來平衡這些問題。

      【H2工具】

      H2有一個基于瀏覽器的控制臺應用程序,以及一套啟動和停止服務器、備份和恢復數據庫的命令行(Shell)工具。

      【三者對比表格】

      名稱

      Derby

      H2

      SQLite

      描述

      全功能的RDBMS,占用空間小,可以嵌入到Java應用程序中,也可以作為數據庫服務器使用。

      全功能的RDBMS,占用空間小,可以嵌入到Java應用程序中,也可以作為數據庫服務器使用。

      廣泛使用的進程內RDBMS

      實施語言

      Java

      Java

      C

      服務器操作系統

      所有帶Java VM的操作系統

      所有帶Java VM的操作系統

      無服務器

      XML?支持

      API和其他訪問方法

      JDBC

      JDBC

      ODBC

      ADO.NET

      JDBC

      ODBC

      支持的編程語言

      Java

      Java

      Actionscript

      Ada

      Basic

      C

      三大嵌入式開源數據庫對比,哪款適合你?

      C#

      C++

      D

      Delphi

      Forth

      Fortran

      Haskell

      Java

      JavaScript

      Lisp

      Lua

      MatLab

      Objective-C

      OCaml

      Perl

      PHP

      PL/SQL

      Python

      R

      Ruby

      Scala

      Scheme

      Smalltalk

      Tcl

      服務器端腳本

      Java存儲過程

      Java存儲過程和用戶定義的函數

      復制方法

      主從復制

      使用集群:不同計算機上的2臺數據庫服務器在數據庫的相同副本上運行。

      一致性概念

      即時一致性

      即時一致性

      并發性

      是,多版本并發控制(MVCC)

      用戶概念

      細粒度的訪問權限,符合SQL標準

      細粒度的訪問權限,符合SQL標準

      no

      最新發布

      10.15.1.3?于?2019年3月11日

      1.4.1.20?于?2019年10月14日

      3.31.1?于?2020年1月27日

      【小結】

      本文對三個主流的嵌入式開源數據庫系統進行了探索,對于Derby數據庫的替換可以參考上述介紹和表格,同時結合自身的業務需求:

      1.?????哪些功能是可以用哪些數據庫替換的?

      2.?????有沒有特殊要求是其他數據庫不能提供而必須使用Derby的?

      如果存在第二種情況的話,團隊可以結合自身能力,在Derby的基礎上進行自研。

      希望本文對業務開發有指導作用,?并對大家有所裨益。

      歡迎討論。

      數據庫 華為開源鏡像站 Mirrors

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel添加雙下劃線和顏色教程介紹
      下一篇:如何提取表格里帶顏色且內容不不同的部分(怎樣把表格有顏色的部分挑出)
      相關文章
      亚洲第一精品电影网| 亚洲日韩区在线电影| 亚洲国产日产无码精品| 亚洲国产精品成人精品无码区| 朝桐光亚洲专区在线中文字幕| 亚洲欧洲无码AV不卡在线| 亚洲色图激情文学| 亚洲娇小性色xxxx| 亚洲六月丁香婷婷综合| 国产精品亚洲专区在线观看| 亚洲国产精品一区二区久| 亚洲免费在线视频观看| 亚洲一级毛片免费观看| 亚洲综合中文字幕无线码| 亚洲最大无码中文字幕| 亚洲日本一线产区和二线 | 精品亚洲一区二区三区在线播放| 亚洲国产精品日韩专区AV| 亚洲AV无码一区二区三区在线观看| 亚洲av无码片vr一区二区三区| 老子影院午夜伦不卡亚洲| 色窝窝亚洲av网| 亚洲一级特黄无码片| 国产午夜亚洲不卡| 亚洲人成色77777| 久久久亚洲精品视频| 亚洲日本一区二区| 亚洲人成综合在线播放| 亚洲色丰满少妇高潮18p| 亚洲精品无码久久久久牙蜜区| 亚洲AV成人片无码网站| 亚洲国产精品丝袜在线观看| 最新国产AV无码专区亚洲| 亚洲成av人在线视| 精品无码一区二区三区亚洲桃色 | 亚洲自偷自偷在线成人网站传媒| 亚洲av无码片vr一区二区三区 | 国产精品亚洲专区在线播放| jjzz亚洲亚洲女人| 中文字幕亚洲天堂| 亚洲国产精品婷婷久久|