前回、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
でリリースされると思われる。
普段何気なく使っているOSSの一部に貢献できてよかった。