Integration of HikariCP with ldbc

Introduction

HikariCP is one of the most widely used database connection pool libraries in Java. When combined with ldbc, it enables efficient database connection management.

Adding Dependencies

First, add the necessary dependencies to build.sbt:

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

Basic HikariCP Configuration

HikariCP has many configuration options. Here are the main configuration items:

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")

// Basic connection pool settings
config.setMaximumPoolSize(10)         // Maximum pool size
config.setMinimumIdle(5)             // Minimum idle connections
config.setConnectionTimeout(30000)    // Connection timeout (milliseconds)
config.setIdleTimeout(600000)        // Idle timeout (milliseconds)

val dataSource = new HikariDataSource(config)

Integration Example with ldbc

Here's a basic example of combining HikariCP with ldbc:

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

// Data model definition
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 configuration
    val ds = new HikariDataSource()
    ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb")
    ds.setUsername("user")
    ds.setPassword("password")
    
    // Establishing connection
    val program = for
      hikari     <- Resource.fromAutoCloseable(IO(ds))
      execution  <- ExecutionContexts.fixedThreadPool[IO](10)
      connection <- ConnectionProvider.fromDataSource[IO](hikari, execution).createConnection()
    yield connection
    
    // Query execution
    program.use { conn =>
      for
        users <- sql"SELECT * FROM users".query[User].to[List].readOnly(conn)
        _     <- IO.println(s"Found users: $users")
      yield ()
    }

Advanced Configuration Examples

HikariCP offers various settings for performance tuning:

val config = new HikariConfig()

// Basic settings
config.setPoolName("MyPool")                // Set pool name
config.setAutoCommit(false)                 // Disable auto-commit

// Performance settings
config.setMaxLifetime(1800000)             // Maximum connection lifetime (30 minutes)
config.setValidationTimeout(5000)          // Connection validation timeout
config.setLeakDetectionThreshold(60000)    // Connection leak detection threshold

// MySQL-specific settings
config.addDataSourceProperty("cachePrepStmts", "true")
config.addDataSourceProperty("prepStmtCacheSize", "250")
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048")

Summary

Combining HikariCP with ldbc provides the following benefits:

With proper configuration and error handling, you can achieve stable, high-performance database access.