Настройка 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 — локальная установка не требуется.
Все уроки этого курса
- Настройка Exposed: подключение к базе данных и DSL транзакций
- Определение таблиц с DSL Table
- CRUD с DSL запросов: insert, select, update, delete
- DAO Exposed: классы сущностей и связи