Desarrollo de Scripts en Kotlin para Monitoreo de Oracle 19c y 23ai
Aquí te dejo ejemplos de uso de espacio, sesiones activas y locks, además de una estructura de proyecto en Kotlin para monitoreo de bases de datos Oracle.
Configuración del Proyecto en Kotlin
Si estás desarrollando un proyecto con Kotlin y Oracle, usa Gradle para gestionar las dependencias.
Estructura del Proyecto
/KotlinOracleMonitor
├── /src
│ ├── Main.kt
│ ├── Database.kt
│ ├── SpaceMonitor.kt
│ ├── SessionMonitor.kt
│ ├── LockMonitor.kt
├── build.gradle.kts
├── settings.gradle.kts
└── README.md
Dependencias en build.gradle.kts
kotlin("jvm") version "1.9.0"
application
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.oracle.database.jdbc:ojdbc8:19.8.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
application {
mainClass.set("MainKt")
}
Configuración de la Conexión a Oracle
Archivo: Database.kt
import java.sql.DriverManager
object Database {
private const val URL = "jdbc:oracle:thin:@//localhost:1521/ORCL"
private const val USER = "admin"
private const val PASSWORD = "password"
fun getConnection(): Connection {
return DriverManager.getConnection(URL, USER, PASSWORD)
}
}
Monitoreo del Uso de Espacio
Archivo: SpaceMonitor.kt
val connection = Database.getConnection()
val query = """
SELECT tablespace_name,
round((used_space / total_space) * 100, 2) AS used_percentage
FROM (
SELECT tablespace_name,
sum(bytes) / 1024 / 1024 AS used_space,
(SELECT sum(bytes) / 1024 / 1024
FROM dba_data_files
WHERE tablespace_name = t.tablespace_name) AS total_space
FROM dba_segments t
GROUP BY tablespace_name
)
"""
val statement = connection.createStatement()
val resultSet = statement.executeQuery(query)
while (resultSet.next()) {
println("Tablespace: ${resultSet.getString("tablespace_name")}, Uso: ${resultSet.getDouble("used_percentage")}%")
}
connection.close()
}
Monitoreo de Sesiones Activas
Archivo: SessionMonitor.kt
val connection = Database.getConnection()
val query = """
SELECT sid, serial#, username, status, machine, osuser, program
FROM v$session
WHERE status = 'ACTIVE'
"""
val statement = connection.createStatement()
val resultSet = statement.executeQuery(query)
while (resultSet.next()) {
println("SID: ${resultSet.getInt("sid")}, User: ${resultSet.getString("username")}, Status: ${resultSet.getString("status")}")
}
connection.close()
}
Monitoreo de Locks (Bloqueos en la Base de Datos)
Archivo: LockMonitor.kt
val connection = Database.getConnection()
val query = """
SELECT l.sid, s.serial#, s.username, l.type, l.lmode, l.request, o.object_name
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
LEFT JOIN dba_objects o ON l.id1 = o.object_id
WHERE l.lmode > 0
"""
val statement = connection.createStatement()
val resultSet = statement.executeQuery(query)
while (resultSet.next()) {
println("SID: ${resultSet.getInt("sid")}, Usuario: ${resultSet.getString("username")}, Objeto: ${resultSet.getString("object_name")}")
}
connection.close()
}
Ejecutar Monitoreo
Archivo: Main.kt
println("Monitoreo de Oracle 19c / 23ai ")
println("\n Uso de Tablespaces:")
checkTablespaceUsage()
println("\n Sesiones Activas:")
checkActiveSessions()
println("\n Locks en la Base de Datos:")
checkLocks()
}
Ejecutar el Proyecto
Compilar y ejecutar
O en Windows:
gradlew.bat run
Salida esperada en consola
Monitoreo de Oracle 19c / 23ai
Uso de Tablespaces:
Tablespace: USERS, Uso: 65.2%
Tablespace: SYSTEM, Uso: 82.3%
Sesiones Activas:
SID: 123, User: SYSTEM, Status: ACTIVE
Locks en la Base de Datos:
SID: 456, Usuario: HR, Objeto: EMPLOYEES
Conclusión
Con este proyecto, un DBA puede:
- Ver sesiones activas en la base de datos.
- Detectar bloqueos (locks) en tiempo real.
- Automatizar reportes o alertas integrando con Telegram, email o Grafana.