データベース接続の管理

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 データベースにクエリを実行する

コネクションプーリング

  • 新規接続のたびにコストのかかるセットアップが発生
  • プーリングにより既存の接続を再利用
  • 使用後は接続がプールに返却される

タクシー乗り場のアナロジー

事前に確立された複数の接続を持つ接続プールを示す図。接続の借用と返却を矢印で表示

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 データベースにクエリを実行する

練習しましょう!

Java で PostgreSQL データベースにクエリを実行する

Preparing Video For Download...