Quản lý kết nối cơ sở dữ liệu

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Miller Trujillo

Staff Software Engineer

Vì sao quản lý kết nối quan trọng?

$$

  • Mỗi kết nối mở một socket mạng
  • Cần xác thực và cấp phát tài nguyên
  • Không đóng kết nối gây rò rỉ tài nguyên
  • Kết nối mới có thể thất bại

Sơ đồ cho thấy nhiều kết nối cơ sở dữ liệu chồng chất, một số được đánh dấu là kết nối "zombie" đang mở nhưng không dùng

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

try-with-resources

String sql = "SELECT COUNT(*) FROM books";


try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
if (rs.next()) { System.out.println("Total books: " + rs.getInt(1)); } }
  • Kết nối được tự động đóng
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Connection pooling

  • Kết nối mới lặp lại thiết lập tốn kém
  • Pooling tái sử dụng kết nối sẵn có
  • Xong việc, kết nối trả về pool

Ví von bãi đỗ taxi

Sơ đồ một connection pool với nhiều kết nối tạo sẵn, mũi tên cho thấy mượn và trả kết nối

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ví dụ HikariCP

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;


HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:postgresql://localhost:5432/library"); config.setUsername("postgres"); config.setPassword("secret");
HikariDataSource ds = new HikariDataSource(config);
try (Connection conn = ds.getConnection()) { System.out.println("Connected with HikariCP!"); }
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Log bảng điều khiển HikariCP

[main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
[main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - 
    Added connection org.postgresql.jdbc.PgConnection@ID
[main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Cùng luyện tập nào!

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Preparing Video For Download...