0Pricing
Kotlin Academy · Урок

Настройка Exposed: подключение к базе данных и DSL транзакций

Подключитесь к базе данных, настройте Exposed и выполняйте код внутри транзакций.

«Настройка Exposed: подключение к базе данных и DSL транзакций» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Что такое Exposed

Exposed — это облегчённый SQL-фреймворк JetBrains для Kotlin. Он предоставляет два уровня: DSL запросов (типобезопасные выражения SQL) и слой DAO (сущности в стиле 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() один раз при запуске. В рабочей среде передавайте HikariDataSource, а для тестов достаточно простого URL JDBC:

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
}))

Блок транзакции { }

Все операции Exposed должны выполняться внутри блока transaction { }. Exposed фиксирует транзакцию при успехе и откатывает её при любом необработанном исключении:

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

Транзакции, совместимые с сопрограммами

Используйте newSuspendedTransaction { } из exposed-r2dbc или 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

Инициализируйте базу данных в модуле 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 — чтобы быстро завершать операцию, когда пул исчерпан. Контролируйте использование пула в рабочей среде.

Быстрая проверка

Что произойдёт, если внутри блока transaction { } в Exposed возникнет необработанное исключение?

Повторение: настройка Exposed и DSL транзакций

Основные выводы:

  • Подключайтесь с помощью Database.connect() один раз при запуске (в рабочей среде используйте HikariCP)
  • Все операции с базой данных выполняются внутри transaction { } — при успехе транзакция фиксируется, а при исключении откатывается
  • Создавайте и удаляйте таблицы с помощью SchemaUtils.create() внутри транзакции
  • В контексте сопрограмм оборачивайте блокирующие вызовы Exposed в withContext(Dispatchers.IO)
  • Во время разработки включайте StdOutSqlLogger, чтобы просматривать сгенерированный SQL

Часто задаваемые вопросы

Урок «Настройка Exposed: подключение к базе данных и DSL транзакций» бесплатный?

Да — полный текст урока «Настройка Exposed: подключение к базе данных и DSL транзакций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Настройка Exposed: подключение к базе данных и DSL транзакций»?

Подключитесь к базе данных, настройте Exposed и выполняйте код внутри транзакций. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Настройка Exposed: подключение к базе данных и DSL транзакций»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка Exposed: подключение к базе данных и DSL транзакций
  2. Определение таблиц с DSL Table
  3. CRUD с DSL запросов: insert, select, update, delete
  4. DAO Exposed: классы сущностей и связи
← Назад к Kotlin Academy