Apache Derby Bài 03: Phân biệt Embedded Mode (nhúng) và Network Server Mode (máy chủ mạng)
1. Bản chất hai mô hình vận hành
Apache Derby sở hữu hai cơ chế vận hành khác biệt về kiến trúc tiến trình và cách phân bổ tài nguyên bộ nhớ: Embedded Mode (Chế độ nhúng) và Network Server Mode (Chế độ máy chủ mạng).
Điểm mấu chốt quyết định sự khác nhau này là: Database Engine nằm cùng một tiến trình JVM với ứng dụng hay nằm ở một tiến trình JVM độc lập bên ngoài?
2. Kiến trúc & Cơ chế hoạt động
1. Embedded Mode (Chế độ nhúng)
Trong Embedded Mode, engine cơ sở dữ liệu không tồn tại dưới dạng một tiến trình (process) chạy nền riêng lẻ. Thay vào đó, toàn bộ mã nguồn xử lý SQL, quản lý bộ đệm và truy xuất tệp đĩa được nạp trực tiếp vào cùng không gian nhớ (Heap) của tiến trình ứng dụng Java.
+-----------------------------------------------------------+
| JVM Ứng dụng (Single Process) |
| |
| [ Mã nguồn ứng dụng Java ] |
| | |
| v (Gọi trực tiếp qua bộ nhớ / Direct Call) |
| [ JDBC Driver: org.apache.derby.jdbc.EmbeddedDriver ] |
| | |
| v |
| [ Derby Database Engine (Buffer, Lock, Parser) ] |
+-----------------------------------------------------------+
|
v (I/O đĩa cục bộ)
+--------------------------------------+
| Thư mục Database trên Filesystem |
| (db.lck, log/, seg0/, service.prop) |
+--------------------------------------+
-
Giao tiếp: Truyền dữ liệu qua phương thức gọi hàm trực tiếp của Java (in-process method calls), không mở cổng TCP/IP, không qua giao thức mạng.
-
Cơ chế khóa tiến trình (File Lock): Ngay khi JVM khởi tạo kết nối tới cơ sở dữ liệu, một tệp khóa mang tên
db.lckđược tạo ra trong thư mục database. Chỉ duy nhất một tiến trình JVM được phép đọc/ghi vào thư mục này tại một thời điểm. Bất kỳ tiến trình JVM nào khác cố mở database đó sẽ bị từ chối với lỗi khóa tệp (ERROR XJ040).
2. Network Server Mode (Chế độ máy chủ mạng)
Trong Network Server Mode, Derby được khởi chạy như một dịch vụ máy chủ độc lập (thông qua lệnh startNetworkServer hoặc API Java). Máy chủ này mở một cổng TCP socket (mặc định là 1527) và lắng nghe các kết nối từ xa.
+---------------------------+ +---------------------------+
| Client App 1 (JVM) | | Client App 2 (Web/API) |
| [ClientDriver / TCP Call] | | [ClientDriver / TCP Call] |
+---------------------------+ +---------------------------+
\ /
DRDA Protocol (Cổng 1527) DRDA Protocol (Cổng 1527)
\ /
v v
+---------------------------------------------------------------+
| JVM Máy chủ Derby (Server Process) |
| |
| [ Network Server Controller / Socket Listener ] |
| | |
| v |
| [ Derby Engine Core ] |
+---------------------------------------------------------------+
|
v (I/O đĩa duy nhất từ phía Server)
+--------------------------------------+
| Thư mục Database trên Filesystem |
+--------------------------------------+
-
Giao tiếp: Sử dụng giao thức chuẩn công nghiệp DRDA (Distributed Relational Database Architecture) qua kết nối mạng TCP/IP.
-
Đa tiến trình truy cập: Vì chỉ có duy nhất tiến trình Network Server trực tiếp nắm giữ
db.lckvà thao tác với tệp đĩa, nhiều client từ nhiều máy trạm hoặc tiến trình JVM khác nhau có thể đồng thời gửi truy vấn tới server mà không bị xung đột khóa tệp.
3. Bảng đối chiếu kỹ thuật chi tiết
| Tiêu chí | Embedded Mode | Network Server Mode |
|---|---|---|
| Tiến trình JVM | Nằm chung trong tiến trình của Client | Tách rời thành tiến trình JVM độc lập |
| Driver Class | org.apache.derby.jdbc.EmbeddedDriver |
org.apache.derby.jdbc.ClientDriver |
| Thư viện JAR cần thiết | derby.jar, derbyshared.jar |
Client cần: derbyclient.jarServer cần: derbynet.jar, derby.jar |
| Định dạng JDBC URL | jdbc:derby:ten_db;create=true |
jdbc:derby://localhost:1527/ten_db;create=true |
| Giao tiếp & Độ trễ | Bộ nhớ nội bộ (In-Memory), độ trễ bằng 0 | TCP Socket (DRDA), phát sinh network latency |
| Số tiến trình mở DB | Duy nhất 1 tiến trình JVM | Đa tiến trình (thông qua Server trung gian) |
| Số kết nối đồng thời | Đa luồng (Multi-threading) trong cùng 1 JVM | Đa luồng, đa máy khách kết nối từ xa |
| Dấu chân tài nguyên (RAM) | Tối thiểu (chia sẻ chung bộ nhớ ứng dụng) | Tốn thêm RAM để duy trì JVM cho server riêng |
| Tác vụ gỡ lỗi / Debug | Không thể dùng công cụ GUI bên ngoài xem bảng khi app đang chạy | Dễ dàng dùng DBeaver, DataGrip kết nối vào song song |
4. Cách lựa chọn cấu hình phù hợp
Khi nào nên triển khai Embedded Mode?
-
Ứng dụng đóng gói một người dùng: Ứng dụng Desktop (Swing, JavaFX) chạy trực tiếp trên máy người dùng, nơi phần mềm cần tự động khởi tạo và lưu trữ cục bộ mà không đòi hỏi người dùng phải cấu hình hay bật bất kỳ service nền nào.
-
Công cụ CLI cục bộ: Các tool tiện ích dòng lệnh cần tra cứu nhanh dữ liệu metadata hoặc cấu hình ngoại tuyến.
-
Tối ưu tốc độ giao dịch nội bộ: Ứng dụng xử lý luồng ghi dữ liệu tốc độ cao tại biên (Edge Computing/IoT), không muốn tiêu hao chi phí đóng gói gói tin TCP/IP qua socket.
Khi nào nên triển khai Network Server Mode?
-
Môi trường phát triển & Gỡ lỗi (Dev/Debug): Bạn cần chạy ứng dụng Java và đồng thời mở DBeaver/IntelliJ Database Tools để quan sát biến động dữ liệu theo thời gian thực.
-
Kiến trúc đa dịch vụ: Khi nhiều microservices, worker background hoặc ứng dụng web cùng cần đọc/ghi chung một kho dữ liệu Derby.
-
Mô hình Client-Server truyền thống: Một máy tính đóng vai trò lưu trữ trung tâm trong mạng LAN cục bộ cho nhiều máy con kết nối vào xử lý công việc.
5. Tổng kết
-
Embedded Mode mang lại tốc độ vượt trội nhờ loại bỏ giao tiếp mạng, nhưng đánh đổi bằng việc giới hạn độc quyền truy cập trong đúng một tiến trình JVM.
-
Network Server Mode giải phóng cơ sở dữ liệu khỏi giới hạn đơn tiến trình, cho phép nhiều ứng dụng và công cụ giao diện đồ họa truy cập song song thông qua cổng
1527.
Bài tiếp theo sẽ đi vào thao tác thực tế: Apache Derby Bài 04: Hướng dẫn cài đặt JDK, Apache Derby và cấu hình biến môi trường DERBY_HOME.
All rights reserved