0

Apache Derby Bài 02: So sánh Apache Derby với SQLite, H2 Database và HSQLDB

1. Bối cảnh lựa chọn Embedded Database

Khi xây dựng các giải pháp nhúng (embedded) hoặc cơ sở dữ liệu gọn nhẹ phục vụ kiểm thử và ứng dụng desktop, các kỹ sư thường cân nhắc bốn cái tên tiêu biểu: Apache Derby, SQLite, H2 Database, và HSQLDB.

Mỗi hệ thống được xây dựng trên một triết lý thiết kế khác nhau:

  • SQLite: Tối ưu hóa tính độc lập, viết bằng C, hướng đến hiệu năng I/O trực tiếp trên đĩa với mô hình một file duy nhất.

  • H2 Database: Viết bằng Java, chú trọng tốc độ thực thi cực nhanh trên RAM/Disk và tính năng giả lập (compatibility modes) cú pháp của các RDBMS lớn.

  • HSQLDB: Lâu đời trong thế giới Java, nổi tiếng với khả năng lưu trữ In-Memory và được LibreOffice/OpenOffice tin dùng.

  • Apache Derby: Thiết kế theo chuẩn doanh nghiệp (thừa hưởng từ IBM Cloudscape), ưu tiên tính tuân thủ nghiêm ngặt chuẩn ANSI/ISO SQL và kiến trúc giao dịch bền bỉ.

2. Bảng so sánh chi tiết các tiêu chí kỹ thuật

Tiêu chí so sánh Apache Derby SQLite H2 Database HSQLDB
Ngôn ngữ viết engine 100% Java C (Native code) 100% Java 100% Java
Dung lượng file thư viện ~3.0 – 3.5 MB ~1.5 MB (native binary/JNI) ~2.5 MB ~3.5 MB
Mô hình triển khai Embedded / Network Server Embedded (Server qua wrapper) Embedded / Server / In-Memory Embedded / Server / In-Memory
Tuân thủ chuẩn SQL Cực kỳ nghiêm ngặt (SQL-92/1999) Linh hoạt, kiểu lỏng (Type Affinity) Tốt (hỗ trợ mô phỏng PG, MySQL, Oracle) Rất tốt (SQL:2008)
Hệ thống kiểu dữ liệu Static typing, kiểm tra chặt chẽ Dynamic typing (có thể gán chuỗi vào cột INT) Static typing, phong phú Static typing, chuẩn hóa cao
Giao dịch & Cấp độ khóa ACID đầy đủ, Row-level & Table-level ACID đầy đủ, Database-level lock ACID đầy đủ, Row-level locking (MVCC) ACID đầy đủ, MVCC & 2PL
Tính tương thích Java/JDBC Chuẩn gốc (Native JDBC) Cần wrapper JNI (SQLite JDBC) Chuẩn gốc (Native JDBC) Chuẩn gốc (Native JDBC)
Cơ chế lưu trữ Thư mục phân cấp (seg0/, log, jar) Single file (.db hoặc .sqlite) File đơn (.mv.db) hoặc RAM Tập hợp file (.data, .properties, .script)
Hiệu năng ghi In-Memory Trung bình Khá Cực nhanh Rất nhanh

3. Phân tích chi tiết từng đối thủ so với Apache Derby

1. Apache Derby vs SQLite

  • Ưu điểm của SQLite:

    • Dung lượng lưu trữ cực nhỏ, toàn bộ database nằm trọn vẹn trong một file duy nhất, rất dễ di chuyển hoặc sao chép.

    • Hiệu năng đọc/ghi trực tiếp từ C/C++ nhanh hơn hầu hết engine Java vì không chịu chi phí biên dịch qua JVM.

  • Hạn chế của SQLite so với Derby:

    • Cần thư viện JNI (Java Native Interface) nếu chạy trên Java, dễ phát sinh lỗi tương thích kiến trúc CPU (x86_64, ARM64).

    • SQLite khóa toàn bộ database khi thực hiện thao tác ghi (database-level locking), khiến ứng dụng đa luồng (multi-threaded) gặp tắc nghẽn giao dịch khi ghi nhiều.

    • SQLite áp dụng kiểu động lỏng lẻo (Type Affinity), có thể khiến dữ liệu không nhất quán nếu thiếu ràng buộc chặt chẽ từ tầng ứng dụng. Derby ép kiểu nghiêm ngặt ngay tại tầng engine.

2. Apache Derby vs H2 Database

  • Ưu điểm của H2:

    • Tốc độ xử lý trong bộ nhớ (In-Memory) và trên đĩa vượt trội hơn Derby nhờ engine MVCC (Multi-Version Concurrency Control) hiện đại.

    • Tích hợp sẵn giao diện Web Console trực quan chỉ bằng một cờ cấu hình.

    • Có chế độ Compatibility Modes (giả lập PostgreSQL, Oracle, MySQL, SQL Server), rất thuận tiện khi dùng để test mock database.

  • Hạn chế của H2 so với Derby:

    • Engine của H2 thay đổi cấu trúc định dạng lưu trữ theo thời gian (như đợt chuyển đổi lớn từ PageStore sang MVStore), đôi khi dẫn đến xung đột phiên bản file lưu trữ.

    • Derby thừa hưởng nền tảng kiểm thử khắt khe từ IBM Cloudscape, giúp cấu trúc file và cơ chế phục hồi sau sự cố (crash recovery) của Derby đạt độ ổn định và an toàn dữ liệu trên đĩa rất cao.

3. Apache Derby vs HSQLDB

  • Ưu điểm của HSQLDB:

    • Rất mạnh ở mảng xử lý bảng trong RAM (Memory-based tables), hiệu năng thực thi các tập dữ liệu tạm thời cao hơn Derby.

    • Hỗ trợ chuẩn SQL hiện đại và các hàm xử lý chuỗi, toán học phong phú.

  • Hạn chế của HSQLDB so với Derby:

    • Mô hình lưu trữ dạng script/text của HSQLDB khi ghi ra đĩa có thể tốn bộ nhớ khi phục hồi dữ liệu lớn.

    • Derby tổ chức dữ liệu nhị phân phân trang (paged binary data) theo chuẩn lưu trữ của IBM, giúp tối ưu hóa việc quản lý bộ đệm trang (Page Cache) tương tự các RDBMS công nghiệp lớn.

4. Ma trận quyết định lựa chọn (Decision Matrix)

                            Bạn đang viết ứng dụng bằng gì?
                                       |
                   +-------------------+-------------------+
                   |                                       |
               Non-Java (C, Python, Go, C#)              Java / JVM
                   |                                       |
               DÙNG SQLITE                 Cần Database cho mục đích gì?
                                                           |
                       +-----------------------------------+-----------------------------------+
                       |                                   |                                   |
              Unit / Mock Test                     Desktop / IoT App                 Enterprise Embedded
          (Cần siêu nhanh, Web GUI)             (Cần nhẹ, 1 file duy nhất)           (Cần ổn định, chuẩn SQL)
                       |                                   |                                   |
                    DÙNG H2                            DÙNG SQLITE                         DÙNG DERBY
                                                     (hoặc H2 Embedded)               (hoặc H2 MVStore)

Chọn Apache Derby khi:

  • Ứng dụng chạy trên nền tảng Java/JVM, cần tính độc lập và khả năng chạy "out-of-the-box" trên bất kỳ hệ điều hành nào mà không cần build native binary.

  • Đòi hỏi tuân thủ chuẩn ANSI SQL nghiêm ngặt để đảm bảo câu lệnh viết ra không bị sai lệch cú pháp khi chuyển sang DB lớn như Oracle hoặc DB2.

  • Cần cơ chế khóa cấp độ dòng (row-level lock) và khôi phục giao dịch tin cậy cho ứng dụng Java máy trạm.

Bài tiếp theo sẽ đi sâu vào việc triển khai thực tế hai mô hình của Derby: Apache Derby Bài 03: Phân biệt Embedded Mode (nhúng) và Network Server Mode (máy chủ mạng).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí