Apache Derby Bài 07: Cú pháp kết nối JDBC URL: jdbc:derby:dbname;create=true và các tham số quan trọng
1. Cấu trúc tổng quát của JDBC URL trong Apache Derby
Trong Apache Derby, chuỗi JDBC URL không chỉ dùng để định vị cơ sở dữ liệu mà còn đóng vai trò cấu hình hành vi của engine ngay thời điểm bắt đầu phiên làm việc.
Cú pháp tổng quát:
Plaintext
jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]*
Các thành phần cốt lõi:
-
jdbc:derby:Tiền tố giao thức bắt buộc (Protocol). -
subsubprotocol:Tùy chọn chỉ định vị trí hoặc phương thức lưu trữ (mặc định là thư mục trên đĩa, hoặcmemory:cho In-Memory,classpath:cho database đóng gói trong JAR). -
databaseName:Tên cơ sở dữ liệu hoặc đường dẫn đến thư mục chứa database. -
;attribute=value: Danh sách các thuộc tính bổ sung, phân tách nhau bởi dấu chấm phẩy (;).
2. Phân biệt URL: Đường dẫn tương đối vs Tuyệt đối
Vị trí lưu trữ vật lý của cơ sở dữ liệu phụ thuộc hoàn toàn vào cách khai báo databaseName:
1. Đường dẫn tương đối (Relative Path)
SQL
-- Database nằm ngay tại thư mục ứng dụng/Terminal đang chạy
CONNECT 'jdbc:derby:firstdb;create=true';
-- Database nằm trong thư mục con data/
CONNECT 'jdbc:derby:data/firstdb;create=true';
-
Ưu điểm: Tính cơ động cao, tiện mang đi cùng dự án.
-
Rủi ro: Nếu bạn khởi chạy ứng dụng từ một thư mục khác, Derby sẽ tạo ra một database mới tại vị trí đó thay vì tìm database cũ.
2. Đường dẫn tuyệt đối (Absolute Path)
SQL
-- Trên Windows
CONNECT 'jdbc:derby:C:/databases/firstdb;create=true';
-- Trên Linux / macOS
CONNECT 'jdbc:derby:/var/lib/derby/firstdb;create=true';
- Lưu ý: Trong chuỗi JDBC URL trên Windows, nên dùng dấu gạch chéo xuôi
/thay vì gạch chéo ngược\để tránh lỗi thoát ký tự (escape character).
3. Các tham số (Attributes) quan trọng nhất
Các tham số được nối tiếp sau tên database bằng dấu chấm phẩy:
| Thuộc tính | Kiểu giá trị | Mô tả chi tiết & Hành vi của Engine |
|---|---|---|
create=true |
Boolean | Tạo cơ sở dữ liệu mới nếu chưa tồn tại. Nếu database đã có sẵn, Derby bỏ qua cờ này và mở bình thường. |
shutdown=true |
Boolean | Tắt database một cách an toàn (giải phóng buffer, checkpoint WAL, xóa db.lck). |
memory:databaseName |
Sub-protocol | Chạy database hoàn toàn trên RAM (In-Memory). Dữ liệu biến mất khi JVM tắt. |
user=...;password=... |
Chuỗi ký tự | Thông tin xác thực khi database bật chế độ xác thực người dùng. |
collation=TERRITORY_BASED |
Enum | Cấu hình quy tắc so sánh chuỗi theo ngôn ngữ (phục vụ sắp xếp tiếng Việt, tiếng Nhật...). |
territory=vi_VN |
Mã Locale | Định vị mã vùng/quốc gia của cơ sở dữ liệu. |
dataEncryption=true |
Boolean | Kích hoạt mã hóa toàn bộ dữ liệu trên đĩa (Data-at-Rest Encryption). |
bootPassword=... |
Chuỗi ký tự | Mật khẩu giải mã dùng cùng với dataEncryption=true. |
4. Các kịch bản sử dụng tham số thực tế
Kịch bản 1: Cơ sở dữ liệu tạm thời trong bộ nhớ (In-Memory Database)
Thích hợp cho Unit Test hoặc các tác vụ cache tạm, không ghi bất kỳ file nào xuống ổ cứng:
SQL
CONNECT 'jdbc:derby:memory:testdb;create=true';
Khi ứng dụng chạy xong và muốn hủy database trên RAM:
SQL
CONNECT 'jdbc:derby:memory:testdb;drop=true';
Kịch bản 2: Hỗ trợ tiếng Việt và sắp xếp chuẩn Locale
Mặc định Derby sử dụng bộ so sánh nhị phân UCS_BASIC (phân biệt hoa thường dạng mã ASCII thô). Để sắp xếp họ tên tiếng Việt chính xác theo bảng chữ cái:
SQL
CONNECT 'jdbc:derby:ql_nhan_su;create=true;territory=vi_VN;collation=TERRITORY_BASED';
Kịch bản 3: Tắt cơ sở dữ liệu an toàn (shutdown=true)
Trong Embedded Mode, khi đóng ứng dụng Java, bạn cần gửi lệnh tắt để Derby dọn dẹp các tệp log và giải phóng khóa db.lck:
-
Tắt 1 database cụ thể:
Plaintext
jdbc:derby:firstdb;shutdown=true -
Tắt toàn bộ hệ thống Derby Engine đang nạp trên JVM:
Plaintext
jdbc:derby:;shutdown=true
Khi gọi
shutdown=true, Derby luôn ném ra một ngoại lệSQLExceptionvới mã lỗi chuẩn08006(đối với tắt 1 database) hoặcXJ015(đối với tắt toàn bộ engine). Đây là hành vi thiết kế có chủ đích của Derby để báo hiệu quá trình ngắt kết nối hoàn tất sạch sẽ, không phải lỗi hệ thống.
5. Tổng kết
-
Chuỗi JDBC URL của Derby cấu hình trực tiếp vòng đời của database thông qua các cờ lệnh.
-
Cờ
;create=truechỉ dùng khi khởi tạo lần đầu; cờ;shutdown=truelà bắt buộc khi kết thúc ứng dụng Embedded để bảo vệ toàn vẹn dữ liệu. -
Việc nắm rõ cách định tuyến đường dẫn tuyệt đối/tương đối và chế độ
memory:giúp bạn kiểm soát hoàn toàn vị trí lưu trữ của engine.
Bài tiếp theo sẽ bắt đầu bước vào việc định nghĩa schema dữ liệu: Apache Derby Bài 08: Tạo bảng (CREATE TABLE), kiểu dữ liệu số, chuỗi và ngày tháng trong Derby.
All rights reserved