Thứ Năm, 27 tháng 7, 2023

Sử dụng JDBC Driver kết nối tới PostgreSQL

 PostgreSQL JDBC là một Opensource driver phổ biến dùng để kết nối tới PostgreSQL. Khác với các driver khác như psql, psqlODBC, PHP, python của PostgreSQL. JDBC sử dụng protocol mở rộng (Extended Protocol) để trao đổi dữ liệu với server process.

PostgreSQL sử dụng protocol dựa vào messages để trao đổi dữ liệu. Có 2 loại protocol trao đổi dữ liệu giữa client và server. Protocol mở rộng (Extended Protocol) và Protocol giản đơn (Simple Protocol). Khác với Protocol giản đơn, Protocol mở rộng sử dụng nhiều công đoạn trao đổi messages giữa client và server để truyền tải dữ liệu. Việc này giúp PostgreSQL có thể tái sử dụng những thao tác xử lý dữ liệu (ví dụ như thao tác parse query), tăng hiệu năng cho hệ thống.

PostgreSQL JDBC


Cộng đồng và cách phát triển PostgreSQL JDBC

Hơi khác với PostgreSQL là sử dụng mailing list, PostgreSQL JDBC phát triển hầu hết dựa vào các tính năng của github như pull request, tạo Issues,..

  • Link github của PostgreSQL JDBC: https://github.com/pgjdbc/pgjdbc
    Bạn có thể thông báo bugs, gửi patch trực tiếp bằng cách tạo issues hoặc create pull request.
    Bạn cũng có thể tham gia mailing list pgsql-jdbc, rồi gửi patch hay thông báo bugs lên mailing list.
  • Website chính thức của PostgreSQL JDBC: https://jdbc.postgresql.org/
    Từ website này, bạn có thể download, tham gia mailing list, và cập nhật thông tin mới nhất về PostgreSQL JDBC Driver.
  • Download: https://jdbc.postgresql.org/download.html
    Community khuyến cáo bạn nên sử dụng phiên bản PostgreSQL JDBC Driver mới nhất. PostgreSQL JDBC Driver support các phiên bản PostgreSQL lớn hơn 8.2 và thích ứng với tất cả các phiên bản này. Tùy thuộc vào JRE (Java Runtime Environment) bạn sử dụng mà download các phiên bản Driver phù hợp. JDBC 4.0 cho JRE 6, JDBC 4.1 cho JRE 7, JDBC 4.2 cho JRE lớn hơn 8.
  • Tài liệu: https://jdbc.postgresql.org/documentation/head/index.html
    Có thể sử dụng nhiều parameters của JDBC bằng cách chỉ định trong URL khi kết nối tới PostgreSQL. Bạn nên tìm hiểu trước các paramters của PostgreSQL JDBC trước khi sử dụng, để có hiệu năng tốt nhất cho hệ thống của bạn.

Tutorial sử dụng JDBC Driver kết nối tới PostgreSQL


Dưới đây là một tutorial ngắn về cách sử dụng PostgreSQL JDBC Driver.

  1. Chuẩn bị JDK Nếu môi trường của bạn chưa cài đặt JDK, có để download tại: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    Môi trường OS mình sử dụng phiên bản JDK 8.

  2. Download PostgreSQL JDBC Driver Download PostgreSQL JDBC Driver phiên bản mới nhất từ: https://jdbc.postgresql.org/download.html.
    Ở đây mình sử dụng phiên bản 42.2.2 JDBC 42

  3. Tạo java program Tạo source file java như bên dưới.
    Program này đơn giản thực hiện các thao tác như bên dưới.

    • Truy nhập vào PostgreSQL Server tại localhost với các thông số kết nối mặc định như bên dưới.
    • Tạo một bảng dữ liệu tạm thời với tên gọi testpg_db, với 5 record khởi tạo.
    • Xem PostgreSQL lưu trữ bảng dữ liệu này với oid như thế nào từ system catalog pg_class.
    • Truy xuất dữ liệu từ bảng và in ra std out.

import java.sql.*;

public class testpg {

	public static void main(String[] args) throws SQLException {
		
		String host="localhost";
		String port="5432";
		String dbname="postgres";
		String user="postgres";
		String pass="postgres";
		String dburl = "jdbc:postgresql://"+host+":"+port+"/"+dbname+"?loggerLevel=OFF";
		Connection conn = null;
		Statement stmt = null;
		PreparedStatement pstmt = null;
		ResultSet ret = null;
		
		try{
			conn = DriverManager.getConnection(dburl, user, pass);
			
			// prepare query to get oid from relation name
			pstmt = conn.prepareStatement("select oid,relname from pg_class where relname = ?;");
			
			stmt = conn.createStatement();
			stmt.executeUpdate("drop table if exists testpg_db;");
			stmt.executeUpdate("create temp table testpg_db as select generate_series(1,5) as id;");
			
			// test prepareStatement
			pstmt.setString(1,"testpg_db");
			ret = pstmt.executeQuery();
			while(ret.next()){
				System.out.println("relation name: "+ret.getString("relname") + ", oid: "+ret.getInt("oid"));
			}
			ret.close();
			
			// test Statement
			ret = stmt.executeQuery("select id from testpg_db");
			while(ret.next()) {
				System.out.println("value: "+ret.getInt("id"));
			}
			
			System.out.println("done.");
		}catch(SQLException ex){
			ex.printStackTrace();
		}finally {
			if (ret != null) {
				ret.close();
			}
			if (stmt != null) {
				stmt.close();
			}
			if (pstmt != null) {
				pstmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		}
	}
}

  1. Thiết lập biến môi trường CLASSPATH

> ls
postgresql-42.2.1.jar  testpg.java

> set CLASSPATH=.;.\postgresql-42.2.1.jar

  1. Biên dịch chương trình

> javac testpg.java

  1. Chạy chương trình

> java testpg
relation name: testpg_db, oid: 242713
value: 1
value: 2
value: 3
value: 4
value: 5
done.

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master