Kotlin Academy · レッスン

Exposedのセットアップ:データベース接続とTransaction DSL

データベースに接続し、Exposedを設定して、トランザクション内でコードを実行します。

レッスン 1/413 ステップ

「Exposedのセットアップ:データベース接続とTransaction DSL」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

Exposedとは

Exposedは、JetBrainsが提供するKotlin向けの軽量なSQLフレームワークです。2つのレベルがあり、Query DSL(型安全なSQL式)とDAO layer(Active Record形式のエンティティ)を利用できます。どちらも明示的なトランザクション内で実行します。

Exposed依存関係の追加

コア、JDBCドライバーブリッジ、使用するデータベースドライバーを追加します:

dependencies {
    implementation("org.jetbrains.exposed:exposed-core:0.52.0")
    implementation("org.jetbrains.exposed:exposed-jdbc:0.52.0")
    implementation("org.jetbrains.exposed:exposed-dao:0.52.0")
    implementation("com.h2database:h2:2.2.224") // or postgresql driver
    implementation("com.zaxxer:HikariCP:5.1.0")  // connection pooling
}

データベースへの接続

起動時にDatabase.connect()を1回呼び出します。本番環境ではHikariDataSourceを渡し、テストでは単純なJDBC URLで問題ありません:

import org.jetbrains.exposed.sql.Database

// Simple (dev/test)
Database.connect(
    url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
    driver = "org.h2.Driver"
)

// Production with HikariCP
Database.connect(HikariDataSource(HikariConfig().apply {
    jdbcUrl = "jdbc:postgresql://localhost/mydb"
    username = "user"
    password = "pass"
    maximumPoolSize = 10
}))

transaction { }ブロック

Exposedのすべての操作はtransaction { }ブロック内で実行する必要があります。Exposedは処理が成功するとコミットし、捕捉されない例外が発生するとロールバックします:

transaction {
    // all DB operations here
    SchemaUtils.create(Users)
}

コルーチン対応トランザクション

コルーチンに対応したトランザクションには、exposed-r2dbcのnewSuspendedTransaction { }、またはexposed-spring-boot-starterを使用します。Ktorでは、ブロッキング処理であるExposedの呼び出しをwithContext(Dispatchers.IO) { transaction { ... } }でラップします:

suspend fun findUser(id: Long): User? = withContext(Dispatchers.IO) {
    transaction {
        UserEntity.findById(id)?.toUser()
    }
}

SchemaUtils:テーブルの作成と削除

存在しないテーブルを作成するにはSchemaUtils.create(Table1, Table2)を使用し、テーブルを削除するにはSchemaUtils.drop()を使用します。アプリケーション起動時に、transaction { }内で呼び出します:

transaction {
    SchemaUtils.create(Users, Posts, Comments)
}

Ktorでの接続設定

サーバー起動時に1回だけ実行されるよう、Applicationモジュールでデータベースを初期化します:

fun Application.configureDatabase() {
    val dbUrl = environment.config.property("ktor.database.url").getString()
    Database.connect(dbUrl, driver = "org.postgresql.Driver",
        user = "...", password = "...")
    transaction { SchemaUtils.create(Users) }
}

トランザクション分離レベル

より強い、またはより弱い整合性保証が必要な場合は、transaction()に分離レベルを渡します:

transaction(Connection.TRANSACTION_SERIALIZABLE) {
    // serializable isolation
}

ネストしたトランザクション

デフォルトでは、ネストしたtransaction { }の呼び出しは外側のトランザクションに参加します。独立したトランザクションを取得するには、transaction(db, outerTransactionIsEmpty = false) { }またはセーブポイントを使用します。

SQLのログ出力

開発中に生成されたクエリを確認できるよう、SQLログを有効にします。トランザクションブロック内でStdOutSqlLoggerまたはカスタムロガーを設定します:

transaction {
    addLogger(StdOutSqlLogger)
    // ...
}

コネクションプールのベストプラクティス

本番環境では必ずHikariCP(または同様のもの)を使用します。maximumPoolSizeはサーバーのスレッド数に合わせて設定し、connectionTimeoutはプールが枯渇したときに速やかに失敗するよう設定します。本番環境ではプールの使用状況を監視します。

クイックチェック

Exposedのtransaction { }ブロック内で捕捉されない例外がスローされると、どうなりますか?

振り返り:ExposedのセットアップとTransaction DSL

重要なポイント:

  • 起動時にDatabase.connect()で1回接続します(本番環境ではHikariCPを使用します)
  • すべてのDB操作をtransaction { }内で実行します — 成功時にコミットし、例外発生時にロールバックします
  • トランザクション内でSchemaUtils.create()を使用してテーブルを作成/削除します
  • コルーチンのコンテキストでは、ブロッキング処理であるExposedの呼び出しをwithContext(Dispatchers.IO)でラップします
  • 開発中はStdOutSqlLoggerを有効にして、生成されたSQLを確認します
無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Exposedのセットアップ:データベース接続とTransaction DSL」レッスンは無料ですか?

はい。「Exposedのセットアップ:データベース接続とTransaction DSL」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「Exposedのセットアップ:データベース接続とTransaction DSL」で何を学びますか?

データベースに接続し、Exposedを設定して、トランザクション内でコードを実行します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Exposedのセットアップ:データベース接続とTransaction DSL」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Exposedのセットアップ:データベース接続とTransaction DSL
  2. Table DSLによるテーブル定義
  3. Query DSLによるCRUD:insert、select、update、delete
  4. Exposed DAO:Entityクラスとリレーションシップ
← Kotlin Academyに戻る