マイグレーションノート (0.4.xから0.5.xへの移行)
パッケージ
新しく追加されたパッケージ
| Module / Platform | JVM | Scala Native | Scala.js | Scaladoc |
|---|---|---|---|---|
ldbc-zio-interop |
✅ | ❌ | ✅ | |
ldbc-authentication-plugin |
✅ | ✅ | ✅ | |
ldbc-aws-authentication-plugin |
✅ | ✅ | ✅ |
廃止されたパッケージ
| Module / Platform | JVM | Scala Native | Scala.js |
|---|---|---|---|
ldbc-hikari |
✅ | ❌ | ❌ |
全てのパッケージ
🎯 主要な変更点
1. ZIOエコシステムサポートの追加
0.5.0から、ldbcでZIOをより簡単に使用できるようになりました。
libraryDependencies += "io.github.takapi327" %% "ldbc-zio-interop" % "0.5.0"
使用例:
import zio.*
import ldbc.zio.interop.*
import ldbc.connector.*
import ldbc.dsl.*
object Main extends ZIOAppDefault:
private val datasource =
MySQLDataSource
.build[Task](
host = "127.0.0.1",
port = 3306,
user = "ldbc"
)
.setPassword("password")
.setDatabase("world")
private val program =
for
connection <- datasource.getConnection
connector = Connector.fromConnection(connection)
result <- sql"SELECT 1".query[Int].to[List].readOnly(connector)
yield result
override def run = program
2. 認証プラグインの強化
新しい認証プラグインモジュールが追加されました。これらのプラグインはPure Scala3で実装され、全てのプラットフォーム(JVM、JS、Native)で利用可能です。
MySQL Clear Password認証
libraryDependencies += "io.github.takapi327" %% "ldbc-authentication-plugin" % "0.5.0"
import ldbc.connector.*
import ldbc.authentication.plugin.*
val datasource = MySQLDataSource
.build[IO](
host = "localhost",
port = 3306,
user = "cleartext-user"
)
.setPassword("plaintext-password")
.setDatabase("mydb")
.setDefaultAuthenticationPlugin(MysqlClearPasswordPlugin)
AWS Aurora IAM認証
libraryDependencies += "io.github.takapi327" %% "ldbc-aws-authentication-plugin" % "0.5.0"
import ldbc.amazon.plugin.AwsIamAuthenticationPlugin
import ldbc.connector.*
val hostname = "aurora-instance.cluster-xxx.region.rds.amazonaws.com"
val username = "iam-user"
val config = MySQLConfig.default
.setHost(hostname)
.setUser(username)
.setDatabase("mydb")
.setSSL(SSL.Trusted) // IAM認証にはSSLが必要
val plugin = AwsIamAuthenticationPlugin.default[IO]("ap-northeast-1", hostname, username)
MySQLDataSource.pooling[IO](config, plugins = List(plugin)).use { datasource =>
val connector = Connector.fromDataSource(datasource)
// クエリ実行
}
3. ldbc-hikariの廃止
ldbc-hikariは0.5.0で正式に廃止されました。組み込みのコネクションプールを使用してください。
廃止されたAPI:
// 使用不可
import ldbc.hikari.*
推奨される方法:
import ldbc.connector.*
val poolConfig = MySQLConfig.default
.setHost("localhost")
.setPort(3306)
.setUser("user")
.setPassword("password")
.setDatabase("mydb")
.setMinConnections(5)
.setMaxConnections(20)
MySQLDataSource.pooling[IO](poolConfig).use { pool =>
val connector = Connector.fromDataSource(pool)
// クエリ実行
}
4. セキュリティ強化
SQLパラメータのエスケープ処理強化
文字列パラメータのエスケープ処理が改善され、SQLインジェクション攻撃への対策が強化されました。
SSRF攻撃対策
データソース設定時のエンドポイント検証が追加されました。
// 安全でないエンドポイントは自動的に検出・拒否される
val datasource = MySQLDataSource
.build[IO]("suspicious-host", 3306, "user")
.setPassword("password")
.setDatabase("mydb")
5. パフォーマンス最適化
最大パケットサイズの設定
MySQLサーバーのmax_allowed_packet設定との互換性が改善されました。
val datasource = MySQLDataSource
.build[IO]("localhost", 3306, "user")
.setPassword("password")
.setDatabase("mydb")
.setMaxPacketSize(16777216) // 16MB(MySQLサーバー設定と合わせる)
コネクションプールの同時性改善
コネクションプールの状態管理がアトミックチェックにより改善され、並行環境での安定性が向上しました。
6. API の改善
ファイルからのクエリ実行
新しいupdateRawsメソッドが追加され、ファイルからSQLクエリを読み込んで実行できるようになりました:
import ldbc.dsl.*
import fs2.io.file.{ Files, Path }
import fs2.text
private def readFile(filename: String): IO[String] =
Files[IO]
.readAll(Path(filename))
.through(text.utf8.decode)
.compile
.string
for
sql <- readFile("hoge.sql")
_ <- DBIO.updateRaws(sql).commit(connector)
yield ()
移行ガイド
ldbc-hikariからの移行
移行前 (0.4.x):
libraryDependencies ++= Seq(
"io.github.takapi327" %% "ldbc-dsl" % "0.4.0",
"io.github.takapi327" %% "ldbc-hikari" % "0.4.0"
)
import ldbc.hikari.*
val hikariConfig = Configuration.default
.setJdbcUrl("jdbc:mysql://localhost:3306/mydb")
.setUsername("user")
.setPassword("password")
.setMaximumPoolSize(20)
HikariDataSource.fromHikariConfig[IO](hikariConfig).use { pool =>
// 使用
}
移行後 (0.5.x):
libraryDependencies ++= Seq(
"io.github.takapi327" %% "ldbc-connector" % "0.5.0",
"io.github.takapi327" %% "ldbc-dsl" % "0.5.0"
)
import ldbc.connector.*
val config = MySQLConfig.default
.setHost("localhost")
.setPort(3306)
.setUser("user")
.setPassword("password")
.setDatabase("mydb")
.setMaxConnections(20)
MySQLDataSource.pooling[IO](config).use { pool =>
val connector = Connector.fromDataSource(pool)
// 使用
}
ZIO統合の追加
Cats Effectベース (従来):
import cats.effect.*
import ldbc.connector.*
val program: IO[List[User]] =
datasource.getConnection.use { connection =>
val connector = Connector.fromConnection(connection)
sql"SELECT * FROM users".query[User].to[List].readOnly(connector)
}
ZIOベース (新規):
import zio.*
import ldbc.zio.interop.*
val program: Task[List[User]] =
datasource.getConnection.use { connection =>
val connector = Connector.fromConnection(connection)
sql"SELECT * FROM users".query[User].to[List].readOnly(connector)
}
まとめ
0.5.x への移行により、以下のメリットが得られます:
- ZIOエコシステムの完全サポート: ZIOベースアプリケーションでの自然な統合
- 強化されたセキュリティ: SSRF攻撃対策、SQLエスケープ処理の改善
- AWS統合の簡素化: Aurora IAM認証の簡単な設定
- パフォーマンスの向上: 最大パケットサイズ対応、プール並行性改善
- 開発者体験の向上: 新しいAPI、バイナリ互換性チェック
移行作業は主にライブラリ依存関係の更新とAPIの小さな変更で完了し、段階的な移行が可能です。