0

Apache Derby Bài 15: Tải Driver và khởi tạo kết nối nhúng (EmbeddedDriver)

1. Kiến trúc kết nối JDBC cơ bản

Java Database Connectivity (JDBC) là bộ API chuẩn của Java dùng để giao tiếp với các hệ quản trị cơ sở dữ liệu. Kiến trúc kết nối cơ bản bao gồm 2 thành phần chính:

  1. DriverManager: Lớp quản lý danh sách các trình điều khiển (Driver) và thiết lập kết nối.

  2. Driver: Trình điều khiển cụ thể do nhà cung cấp cơ sở dữ liệu viết (ở đây là thư viện derby.jar của Apache).

Đối với Apache Derby ở chế độ nhúng, chúng ta sử dụng lớp Driver có tên là: org.apache.derby.jdbc.EmbeddedDriver

2. Nạp (Load) Driver vào bộ nhớ JVM

Trong các phiên bản Java cũ (trước JDBC 4.0 / Java 6), lập trình viên bắt buộc phải tải Driver vào bộ nhớ một cách tường minh thông qua phương thức Class.forName().

Java

try {
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
    System.out.println("Tải EmbeddedDriver thành công!");
} catch (ClassNotFoundException e) {
    System.out.println("Không tìm thấy thư viện derby.jar");
}

Lưu ý quan trọng với Java hiện đại: Từ JDBC 4.0 trở đi (bao gồm Java 17, 21 mà chúng ta đang sử dụng), cơ chế Service Provider Interface (SPI) cho phép DriverManager tự động quét và nạp các Driver có sẵn trong CLASSPATH (tức là file derby.jar bạn đã cấu hình qua Maven/Gradle ở bài trước). Do đó, bạn có thể bỏ qua dòng lệnh Class.forName(...) này. Tuy nhiên, việc biết đến nó vẫn rất hữu ích khi bạn cần debug lỗi thiếu thư viện.

3. Khởi tạo kết nối (Connection)

Để mở kết nối tới cơ sở dữ liệu, chúng ta sử dụng phương thức DriverManager.getConnection(). Phương thức này nhận vào một chuỗi JDBC URL (đã học ở Bài 07).

Cú pháp cốt lõi:

Java

String dbUrl = "jdbc:derby:ten_csdl;create=true";
Connection conn = DriverManager.getConnection(dbUrl);

Khi phương thức này được gọi trong Embedded Mode:

  1. Derby Engine sẽ khởi động trực tiếp bên trong JVM của ứng dụng.

  2. Kiểm tra xem thư mục ten_csdl đã có trên ổ cứng chưa, nếu chưa sẽ tạo mới (nhờ cờ create=true).

  3. Sinh ra tệp db.lck để khóa cơ sở dữ liệu, ngăn tiến trình khác can thiệp.

4. Thực hành: Viết mã nguồn kết nối hoàn chỉnh

Tạo một class Java mang tên DerbyConnectionDemo trong dự án Maven/Gradle của bạn và chạy đoạn mã sau. Chúng ta sẽ sử dụng cú pháp Try-with-Resources (ra mắt từ Java 7) để đảm bảo đối tượng Connection luôn được đóng an toàn (tự động gọi conn.close()) ngay cả khi có lỗi xảy ra.

Java

package com.hieu.derby;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DerbyConnectionDemo {

    // Khai báo JDBC URL - Tạo DB tên là 'my_embedded_db' tại thư mục gốc dự án
    private static final String JDBC_URL = "jdbc:derby:my_embedded_db;create=true";

    public static void main(String[] args) {
        System.out.println("Đang khởi tạo kết nối tới Apache Derby...");

        // Sử dụng Try-with-Resources để tự động đóng Connection
        try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
            
            if (conn != null) {
                System.out.println("=> Kết nối thành công!");
                
                // Lấy thông tin Metadata của cơ sở dữ liệu để xác nhận
                String dbProductName = conn.getMetaData().getDatabaseProductName();
                String dbVersion = conn.getMetaData().getDatabaseProductVersion();
                
                System.out.println("Hệ quản trị CSDL: " + dbProductName);
                System.out.println("Phiên bản: " + dbVersion);
            }

        } catch (SQLException e) {
            System.err.println("=> Lỗi kết nối CSDL: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Kết quả xuất ra màn hình (Console):

Plaintext

Đang khởi tạo kết nối tới Apache Derby...
=> Kết nối thành công!
Hệ quản trị CSDL: Apache Derby
Phiên bản: 10.17.1.0 - (1908030)

Đồng thời, nếu nhìn vào cây thư mục của IDE, bạn sẽ thấy thư mục my_embedded_db vừa được sinh ra cùng tệp derby.log.

5. Quản lý ngoại lệ SQLException

Mọi thao tác liên quan đến JDBC (từ mở kết nối, thực thi truy vấn đến đóng kết nối) đều có rủi ro phát sinh lỗi (như sai đường dẫn, thư mục bị khóa, sai cú pháp SQL). Java bắt buộc bạn phải bắt (catch) hoặc ném (throws) ngoại lệ java.sql.SQLException.

Đối tượng SQLException trong Derby chứa các phương thức rất hữu ích để gỡ lỗi:

  • e.getMessage(): Lấy chuỗi thông báo lỗi chi tiết.

  • e.getSQLState(): Lấy mã trạng thái SQL chuẩn (ví dụ: XJ040 là lỗi database đang bị khóa bởi JVM khác, 08006 là mã thông báo tắt DB an toàn).

  • e.getErrorCode(): Lấy mã lỗi nguyên thủy do Derby định nghĩa.

6. Tổng kết

  • Với Java hiện đại, bạn không cần dùng Class.forName() để nạp EmbeddedDriver, DriverManager sẽ tự động tìm kiếm thư viện derby.jar.

  • Luôn sử dụng cú pháp try-with-resources khi làm việc với Connection để tránh rò rỉ bộ nhớ (memory leak).

  • Chuỗi URL jdbc:derby:TÊN_DB;create=true là chìa khóa để khởi động Engine và tạo file vật lý trên đĩa.

Bây giờ bạn đã có chiếc cầu nối kết nối ứng dụng Java với dữ liệu. Ở bài tiếp theo, chúng ta sẽ bắt đầu gửi các câu lệnh SQL qua cầu nối này: Apache Derby Bài 16: Thực thi truy vấn với Statement và ResultSet.


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í