/var/log/jsoizo

メモ帳 技術とか趣味とか

AWS JDBC Driver for MySQLをslick経由で使いたい

前回、AWS JDBC Driver for MySQLの検証を行ったが、実際にはそのままJDBCドライバを使うということはなく、scalaなアプリケーションで使いたいときにはslickから呼び出すことが多いと思われる。

また、AWS JDBC Driver for MySQLはコネクションプールとしてHikariCPを利用しているときに以下2点が必要である。

  • SQLExceptionOverride を継承してAWS JDBC Driver for MySQLが出す一部SQLExceptionの例外処理の実装
  • 実装した例外処理をHikariCPの設定に追加( setExceptionOverrideClassName )

ここで、slick利用時 Database.forConfig でDatabaseインスタンスを作成することになるが、slickの設定ファイルの記載にHikariCPの setExceptionOverrideClassName に相当する項目が存在していない。

なので、 HikariDataSource をnewして Database.forDataSource によりDatabaseインスタンスを作成する必要がある。

class HikariCPSQLException extends SQLExceptionOverride {
  import SQLExceptionOverride.Override
  private val ignoreSQLStates = Seq("08S02", "08007")
  override def adjudicate(sqlException: SQLException): SQLExceptionOverride.Override = {
    val sqlState = sqlException.getSQLState
    if (ignoreSQLStates.exists(sqlState.equalsIgnoreCase)) Override.DO_NOT_EVICT
    else Override.CONTINUE_EVICT
  }
}

val connectionPool: HikariDataSource = {
  val _config = new HikariConfig()
  _config.setJdbcUrl(jdbcUrl)
  _config.setUsername(user)
  _config.setPassword(password)
  _config.setExceptionOverrideClassName("com.jsoizo.HikariCPSQLException")
  new HikariDataSource(_config)
}
val database = Database.forDataSource(connectionPool)

これはさすがに面倒なので、 Database.forConfig でconfファイルから exceptionOverrideClassName を設定できるように修正しPull Requestを出して取り込んでもらった。次バージョン 3.4.2 でリリースされると思われる。

github.com

普段何気なく使っているOSSの一部に貢献できてよかった。