0

Apache Derby Bài 01: Apache Derby là gì? Lịch sử, kiến trúc và các trường hợp sử dụng phù hợp

1. Mở đầu

Khi phát triển ứng dụng Java, nhu cầu lưu trữ dữ liệu có cấu trúc là một bài toán quen thuộc. Thông thường, chúng ta nghĩ ngay đến các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) quy mô lớn như PostgreSQL hay MySQL. Tuy nhiên, việc dựng và quản lý một server database riêng biệt đôi khi quá cồng kềnh cho các ứng dụng desktop nhỏ gọn, các công cụ kiểm thử tự động, hoặc các hệ thống nhúng cục bộ.

Apache Derby ra đời như một giải pháp chuẩn mực cho hệ sinh thái Java: một RDBMS hoàn chỉnh, tuân thủ tiêu chuẩn SQL/JDBC, viết bằng 100% mã nguồn Java và có khả năng chạy "nhúng" trực tiếp trong cùng tiến trình với ứng dụng mà không cần cài đặt dịch vụ nền phức tạp.

2. Apache Derby là gì?

Apache Derby là một hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở được phát triển bởi Apache Software Foundation.

Các đặc tính cốt lõi của Derby bao gồm:

  • Thuần Java (100% Pure Java): Derby chạy trên bất kỳ môi trường Java Virtual Machine (JVM) tương thích nào mà không phụ thuộc vào thư viện native của hệ điều hành.

  • Kích thước nhỏ gọn (Lightweight): Toàn bộ engine của cơ sở dữ liệu và JDBC driver gói gọn trong tệp JAR có dung lượng chỉ khoảng vài megabyte (thường dưới 3.5 MB).

  • Tuân thủ tiêu chuẩn cao: Hỗ trợ chuẩn SQL-92, SQL:1999 và chuẩn kết nối JDBC/Java EE đầy đủ.

  • Giao dịch ACID hoàn chỉnh: Đảm bảo toàn vẹn dữ liệu với Atomicity, Consistency, Isolation, Durability; hỗ trợ phục hồi khi gặp sự cố (crash recovery) và khóa ở cấp độ dòng (row-level locking).

3. Lịch sử phát triển: Từ Cloudscape đến Apache Derby

Hành trình của Derby là một trong những câu chuyện thú vị về sự phát triển của phần mềm mã nguồn mở từ sản phẩm thương mại:

Năm Cột mốc
1996 Công ty Cloudscape Inc. được thành lập và phát triển một RDBMS viết hoàn toàn bằng Java mang tên Cloudscape.
1999 Informix Software mua lại Cloudscape Inc. để bổ sung giải pháp cơ sở dữ liệu nhúng cho danh mục sản phẩm của họ.
2001 IBM mua lại mảng cơ sở dữ liệu của Informix, sở hữu cả Cloudscape và tiếp tục nâng cấp sản phẩm.
2004 IBM quyết định đóng góp toàn bộ mã nguồn của Cloudscape cho Apache Software Foundation dưới tên dự án Apache Derby.
2006 Sun Microsystems tích hợp một bản phân phối của Derby vào bộ Java SE SDK (kể từ Java 6) dưới tên gọi Java DB.
Hiện nay Derby tiếp tục được duy trì dưới sự quản lý của Apache Software Foundation như một dự án mã nguồn mở ổn định và độc lập.

4. Kiến trúc hệ thống của Apache Derby

Derby được thiết kế theo cấu trúc module xếp tầng rõ ràng, đảm bảo tính đóng gói và hiệu quả khi thực thi trên JVM:

+-----------------------------------------------------------+
|                    JDBC Driver Layer                      |
|       (org.apache.derby.jdbc.EmbeddedDriver / Client)     |
+-----------------------------------------------------------+
                             |
                             v
+-----------------------------------------------------------+
|                    SQL Processing Layer                   |
|   Parser  --->  Compiler / Optimizer  --->  Execution     |
+-----------------------------------------------------------+
                             |
                             v
+-----------------------------------------------------------+
|                   Storage / Engine Layer                  |
|    - Buffer Management & Cache (Data Page 4KB/32KB)       |
|    - Concurrency & Lock Manager (Row / Table Lock)        |
|    - Logging & Recovery (Write-Ahead Logging - WAL)       |
+-----------------------------------------------------------+
                             |
                             v
+-----------------------------------------------------------+
|                 Filesystem / Disk Layer                   |
|            (Log Files, Seg0 Data Files, Properties)       |
+-----------------------------------------------------------+

Các thành phần chính trong kiến trúc:

  1. JDBC Driver Layer: Cung cấp giao diện tương thích chuẩn java.sql.* và javax.sql.*. Lập trình viên không cần học API độc quyền mà sử dụng trực tiếp các đối tượng chuẩn như Connection, PreparedStatement, ResultSet.

  2. SQL Processing Layer:

    • Parser: Phân tích cú pháp câu truy vấn SQL gửi vào.

    • Compiler / Optimizer: Tối ưu hóa kế hoạch thực thi, lựa chọn việc quét bảng (table scan) hay duyệt cây B-tree (index scan) dựa trên thống kê chi phí.

    • Execution Engine: Trực tiếp thực thi bytecode hoặc kế hoạch truy vấn đã tạo.

  3. Storage Engine Layer:

    • Buffer Manager: Quản lý bộ đệm trang (Page Cache) trong bộ nhớ heap của JVM để giảm thiểu thao tác I/O trên đĩa.

    • Lock Manager: Điều phối các giao dịch truy cập đồng thời, phân định cấp độ khóa dòng hoặc khóa bảng nhằm tránh xung đột dữ liệu.

    • Log & Recovery: Triển khai cơ chế Write-Ahead Logging (WAL) ghi nhận mọi thay đổi vào file log trước khi cập nhật vào bảng dữ liệu chính, đảm bảo an toàn sau sự cố mất điện/sập ứng dụng.

5. Hai chế độ vận hành (Deployment Modes)

Derby cung cấp hai mô hình triển khai linh hoạt tùy theo bài toán:

1. Embedded Mode (Chế độ nhúng)

  • Cơ sở dữ liệu và ứng dụng chạy trong cùng một tiến trình JVM.

  • Ứng dụng khởi động động cơ cơ sở dữ liệu thông qua EmbeddedDriver.

  • Không có giao tiếp mạng qua socket, loại bỏ hoàn toàn độ trễ đường truyền (network latency).

  • Đặc điểm: Chỉ duy nhất một JVM có thể mở kết nối ghi/đọc tới thư mục database tại một thời điểm (được bảo vệ bằng cơ chế file lock).

2. Network Server Mode (Chế độ máy chủ mạng)

  • Derby chạy như một dịch vụ độc lập (standalone process), mở một cổng mạng (mặc định là 1527).

  • Nhiều tiến trình client, ứng dụng web hoặc công cụ GUI (DBeaver, DataGrip) có thể kết nối đồng thời thông qua ClientDriver qua giao thức DRDA (Distributed Relational Database Architecture).

6. Khi nào nên dùng và khi nào không nên dùng Apache Derby?

Trường hợp phù hợp (Best Use Cases) Trường hợp nên tránh (Anti-Patterns)
Ứng dụng Desktop (JavaFX, Swing): Cần một database cục bộ đi kèm ứng dụng mà người dùng cuối không phải tự tay cài SQL server. Hệ thống Web chịu tải cao: Ứng dụng phân tán microservices cần xử lý hàng chục nghìn truy vấn đồng thời (high concurrency).
Thiết bị biên & IoT (Edge Devices): Môi trường phần cứng chạy Linux nhúng hoặc thiết bị cần RDBMS gọn nhẹ, ít ngốn RAM. Lưu trữ dữ liệu lớn (Big Data / Data Warehousing): Dữ liệu vượt quá hàng trăm gigabyte hoặc terabyte.
Integration Testing: Dùng để chạy các bài test tích hợp tự động trong CI/CD pipeline, dựng lên và hủy đi một cách nhanh chóng mà không cần Docker. Hệ thống phân tán có phân vùng dữ liệu: Yêu cầu Sharding, Multi-Region Replication hoặc High Availability nâng cao.
Các sản phẩm dạng Appliance: Phần mềm đóng gói sẵn (packaged software) tự phục vụ cho doanh nghiệp nội bộ. Các ứng dụng không viết bằng Java: Muốn tìm một engine nhúng (SQLite sẽ phù hợp hơn cho C++, Python, Go,...).

7. Tổng kết

  • Apache Derby là một RDBMS thuần Java 100%, tuân thủ tiêu chuẩn ANSI SQL và JDBC, nhỏ gọn nhưng đầy đủ tính năng ACID.

  • Khả năng chạy ở chế độ Embedded giúp nó trở thành lựa chọn tối ưu cho ứng dụng desktop, thiết bị nhúng và viết kiểm thử tích hợp.

  • Đối với các hệ thống phân tán đa dịch vụ cần truy cập cùng lúc, Derby hỗ trợ Network Server Mode qua cổng 1527.

Ở bài tiếp theo, chúng ta sẽ đặt Derby lên bàn cân cùng các đối thủ cùng phân khúc: Apache Derby Bài 02: So sánh Apache Derby với SQLite, H2 Database và HSQLDB.


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í