HikariCPとldbcの連携

はじめに

HikariCPは、Javaのデータベースコネクションプールライブラリとしてもっとも広く使用されているライブラリの一つです。 ldbcではHikariCPと組み合わせることで、効率的なデータベース接続の管理が可能になります。

依存関係の追加

まず、build.sbtに必要な依存関係を追加します:

libraryDependencies ++= Seq(
  "com.mysql" % "mysql-connector-j" % "8.4.0",
  "com.zaxxer" % "HikariCP" % "6.2.1"
)

HikariCPの基本設定

HikariCPには多くの設定オプションがあります。以下に主要な設定項目を示します:

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

val config = new HikariConfig()
config.setJdbcUrl("jdbc:mysql://localhost:3306/database")
config.setUsername("username")
config.setPassword("password")

// コネクションプールの基本設定
config.setMaximumPoolSize(10)         // 最大プールサイズ
config.setMinimumIdle(5)             // 最小アイドル接続数
config.setConnectionTimeout(30000)    // 接続タイムアウト(ミリ秒)
config.setIdleTimeout(600000)        // アイドルタイムアウト(ミリ秒)

val dataSource = new HikariDataSource(config)

ldbcとの連携例

以下は、HikariCPとldbcを組み合わせた基本的な使用例です:

import cats.effect.*
import com.zaxxer.hikari.HikariDataSource
import ldbc.dsl.*
import ldbc.dsl.codec.Codec
import jdbc.connector.*

// データモデルの定義
case class User(id: Int, name: String, email: String)
object User:
  given Codec[User] = Codec.derived[User]

object HikariExample extends IOApp.Simple:
  def run: IO[Unit] =
    // HikariCPの設定
    val ds = new HikariDataSource()
    ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb")
    ds.setUsername("user")
    ds.setPassword("password")
    
    // コネクションの確立
    val program = for
      hikari     <- Resource.fromAutoCloseable(IO(ds))
      execution  <- ExecutionContexts.fixedThreadPool[IO](10)
      connection <- ConnectionProvider.fromDataSource[IO](hikari, execution).createConnection()
    yield connection
    
    // クエリの実行
    program.use { conn =>
      for
        users <- sql"SELECT * FROM users".query[User].to[List].readOnly(conn)
        _     <- IO.println(s"Found users: $users")
      yield ()
    }

高度な設定例

HikariCPには、パフォーマンスチューニングのための様々な設定があります:

val config = new HikariConfig()

// 基本設定
config.setPoolName("MyPool")                // プール名の設定
config.setAutoCommit(false)                 // 自動コミットの無効化

// パフォーマンス設定
config.setMaxLifetime(1800000)             // 接続の最大生存時間(30分)
config.setValidationTimeout(5000)          // 接続検証のタイムアウト
config.setLeakDetectionThreshold(60000)    // 接続リーク検出のしきい値

// MySQLに特化した設定
config.addDataSourceProperty("cachePrepStmts", "true")
config.addDataSourceProperty("prepStmtCacheSize", "250")
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048")

まとめ

HikariCPとldbcを組み合わせることで、以下のような利点が得られます:

適切な設定とエラーハンドリングを行うことで、安定した高パフォーマンスのデータベースアクセスが実現できます。