管理数据库连接

在 Java 中查询 PostgreSQL 数据库

Miller Trujillo

Staff Software Engineer

为何要管理连接?

$$

  • 每个连接都会打开一个网络套接字
  • 需要认证与资源分配
  • 未关闭的连接会泄露资源
  • 新建连接可能失败

一个图示显示大量数据库连接堆积,其中一些标注为"僵尸"连接(已打开但未使用)

在 Java 中查询 PostgreSQL 数据库

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)); } }
  • 连接会自动关闭
在 Java 中查询 PostgreSQL 数据库

连接池(Connection pooling)

  • 新建连接会重复昂贵的初始化
  • 连接池可复用现有连接
  • 用完后将连接归还到池中

出租车站类比

一个图示显示连接池包含多条预建连接,箭头表示借用与归还连接

在 Java 中查询 PostgreSQL 数据库

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!"); }
在 Java 中查询 PostgreSQL 数据库

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.
在 Java 中查询 PostgreSQL 数据库

Ayo berlatih!

在 Java 中查询 PostgreSQL 数据库

Preparing Video For Download...