Configuración de Exposed: conexión a la base de datos y DSL de transacciones
Conéctese a una base de datos, configure Exposed y ejecute código dentro de transacciones.
Configuración de Exposed: conexión a la base de datos y DSL de transacciones es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué es Exposed?
Exposed es un framework SQL ligero de JetBrains para Kotlin. Ofrece dos niveles: un Query DSL (expresiones SQL con seguridad de tipos) y una capa DAO (entidades de estilo Active Record). Ambos se ejecutan dentro de transacciones explícitas.
Añadir dependencias de Exposed
Añada el núcleo, el puente del controlador JDBC y el controlador de su base de datos:
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
}Conexión a la base de datos
Llame a Database.connect() una vez durante el inicio. En producción, pase un HikariDataSource; para las pruebas, basta con una URL JDBC sencilla:
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
}))El bloque transaction { }
Todas las operaciones de Exposed deben ejecutarse dentro de un bloque transaction { }. Exposed confirma la transacción si todo va bien y revierte los cambios ante cualquier excepción no controlada:
transaction {
// all DB operations here
SchemaUtils.create(Users)
}Transacciones compatibles con corrutinas
Use newSuspendedTransaction { } de exposed-r2dbc o el exposed-spring-boot-starter para obtener transacciones compatibles con corrutinas. En Ktor, envuelva las llamadas bloqueantes de Exposed en withContext(Dispatchers.IO) { transaction { ... } }:
suspend fun findUser(id: Long): User? = withContext(Dispatchers.IO) {
transaction {
UserEntity.findById(id)?.toUser()
}
}SchemaUtils: creación y eliminación de tablas
Use SchemaUtils.create(Table1, Table2) para crear las tablas si no existen y SchemaUtils.drop() para eliminarlas. Llame a estas funciones dentro de un bloque transaction { } durante el inicio de la aplicación:
transaction {
SchemaUtils.create(Users, Posts, Comments)
}Configuración de una conexión en Ktor
Inicialice la base de datos en un módulo de Application para que se ejecute una sola vez cuando se inicie el servidor:
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) }
}Niveles de aislamiento de transacciones
Pase un nivel de aislamiento a transaction() cuando necesite garantías de consistencia más estrictas o más flexibles:
transaction(Connection.TRANSACTION_SERIALIZABLE) {
// serializable isolation
}Transacciones anidadas
De forma predeterminada, las llamadas anidadas a transaction { } se unen a la transacción externa. Para obtener una transacción independiente, use transaction(db, outerTransactionIsEmpty = false) { } o un punto de guardado.
Registro de SQL
Active el registro de SQL para ver las consultas generadas durante el desarrollo. Configure un StdOutSqlLogger o un registrador personalizado dentro del bloque de transacción:
transaction {
addLogger(StdOutSqlLogger)
// ...
}Prácticas recomendadas para la agrupación de conexiones
Use siempre HikariCP (o una alternativa similar) en producción. Configure maximumPoolSize para que coincida con el número de hilos del servidor y connectionTimeout para que falle rápidamente cuando el pool se agote. Supervise la utilización del pool en producción.
Comprobación rápida
¿Qué ocurre si se lanza una excepción no controlada dentro de un bloque transaction { } en Exposed?
Resumen: configuración de Exposed y DSL de transacciones
Puntos clave:
- Conéctese con
Database.connect()una vez durante el inicio (use HikariCP en producción) - Todas las operaciones de base de datos se ejecutan dentro de
transaction { }: la transacción se confirma si todo va bien y se revierte si se produce una excepción - Cree o elimine tablas con
SchemaUtils.create()dentro de una transacción - En contextos de corrutinas, envuelva las llamadas bloqueantes de Exposed en
withContext(Dispatchers.IO) - Active
StdOutSqlLoggerdurante el desarrollo para inspeccionar el SQL generado
Preguntas frecuentes
¿La lección «Configuración de Exposed: conexión a la base de datos y DSL de transacciones» es gratis?
Sí — el texto completo de «Configuración de Exposed: conexión a la base de datos y DSL de transacciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Configuración de Exposed: conexión a la base de datos y DSL de transacciones»?
Conéctese a una base de datos, configure Exposed y ejecute código dentro de transacciones. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Configuración de Exposed: conexión a la base de datos y DSL de transacciones»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Configuración de Exposed: conexión a la base de datos y DSL de transacciones
- Definir tablas con el DSL Table
- CRUD con el DSL de consultas: insert, select, update y delete
- DAO de Exposed: clases Entity y relaciones