Quarkus×Kotlinで遊んでみる②
はじめに
実装開始する
- まずはgradleにORMの依存を注入する
./gradlew listExtensions
依存できるものを確認できるが、今回はagroal
を追加すれば良いということがわかっているので、./gradlew addExtension --extensions="artifactId"
で実行すれば良い
./gradlew addExtension --extensions="agroal" > Task :addExtension ✅ Adding extension io.quarkus:quarkus-agroal BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
ちなみに、agroal
はORMなので、Hibernateを使ってる場合は追加する必要はないし、Hibernateでも代用できる
余談ですが、./gradlew addExtension --extensions="artifactId"
のextensionへの引数は複数指定できる模様です。ただし、jdbc
のように複数引っかかるものを指定してしまうと怒られるので、jdbc*
で全部入れてあげるか、必要なもののみ指定してあげるのが良さそうです。
- database driverの依存を追加する
現状、quarkusで利用できるdriverは下記の通り。
H2 - jdbc-h2 PostgreSQL - jdbc-postgresql MariaDB - jdbc-mariadb MySQL - jdbc-mysql Microsoft SQL Server - jdbc-mssql Derby - jdbc-derby
src/main/resources/application.properties
に諸々追加する
quarkus.datasource.url=jdbc:mysql://localhost:3306/test quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource quarkus.datasource.username=test quarkus.datasource.min-size=5 quarkus.datasource.max-size=10
- あとはDBアクセスするレイヤでDIしてあげるのみ
@Inject private lateinit var defaultDataSource : AgroalDataSource
ちなみに、agroalは複数のdatabase情報に持つことができ、DIするタイミングでアノテーションで明示することで必要なもののみ注入することができる。
quarkus.datasource.url=jdbc:mysql://localhost/company quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource quarkus.datasource.username=test quarkus.datasource.min-size=5 quarkus.datasource.max-size=10 quarkus.datasource.url=jdbc:mysql://localhost/users quarkus.datasource.driver=com.mysql.cj.jdbc.MysqlDataSource quarkus.datasource.username=test quarkus.datasource.min-size=5 quarkus.datasource.max-size=10
@Inject @DataSource("users") private lateinit var usersDataSource : AgroalDataSource @Inject @DataSource("company") private lateinit var companyDataSource : AgroalDataSource
あとは、AgroalDataSourceはjavax.sql.DataSourceを継承してるので、コネクションを作成して生のsqlを流せば良いかと。
val connection = defaultDataSource.connection val prepareStatement = connection.prepareStatement("selecet * from users")
とりあえず今回はDBアクセスまでできたので終了とする。
まとめ
- quarkusとしてはagroalを標準として推しており、その理由としては高いパフォーマンスとスケーラビリティを意識した軽量なコネクションプール実装がされているということかららしい。
- とはいえ、Hibernateも使えるので、そこは柔軟だなと。