Unidad 25
Temas Avanzados en
JDBC
Contenidos
1. Gestión de Transacciones en JDBC 3
2. Batch Processing en JDBC 5
3. Uso de CallableStatement y Procedimientos Almacenados 7
4. Buenas Prácticas en Temas Avanzados de JDBC 8
5. Test de Autoevaluación 9
25. Temas Avanzados en JDBC
25. Temas Avanzados en JDBC
1. Gestión de Transacciones en JDBC
1.1. Concepto y Objetivos
• Transacción:Una transacción es un conjunto de operaciones que se ejecutan como una unidad indivisible. El objetivo
es garantizar que todas las operaciones se completen correctamente o, en caso contrario, revertir los cambios para
mantener la integridad de la base de datos.
• Commit y Rollback:
• Commit: Confirma todas las operaciones realizadas dentro de la transacción.
• Rollback: Revierte todas las operaciones en caso de error, devolviendo la base de datos a su estado anterior.
1.2. Ejemplo Práctico: Manejo de Transacciones
En el siguiente ejemplo se muestra cómo desactivar el modo autocommit, realizar varias operaciones y confirmar o
revertir la transacción según sea necesario:
3
25. Temas Avanzados en JDBC
import [Link];
import [Link];
import [Link];
import [Link];
public class TransaccionJDBC {
private static final String URL = “jdbc:mysql://localhost:3306/mi_base”;
private static final String USUARIO = “usuario”;
private static final String CONTRASENA = “contrasena”;
public static void main(String[] args) {
try (Connection conn = [Link](URL, USUARIO,
CONTRASENA)) {
// Desactivar el autocommit para gestionar la transacción man-
ualmente
[Link](false);
try (PreparedStatement psInsert = [Link](“INSERT
INTO cuentas (usuario, saldo) VALUES (?, ?)”);
PreparedStatement psUpdate = [Link](“UP-
DATE cuentas SET saldo = saldo - ? WHERE usuario = ?”)) {
// Primera operación: inserción de registro
[Link](1, “nuevo_usuario”);
[Link](2, 1000.0);
[Link]();
// Segunda operación: actualización de saldo
[Link](1, 1000.0);
[Link](2, “usuario_existente”);
[Link]();
// Si todo va bien, se confirma la transacción
[Link]();
[Link](“Transacción completada correcta-
mente.”);
} catch (SQLException e) {
// En caso de error, se revierte la transacción
[Link]();
[Link](“Error durante la transacción. Se re-
alizó rollback. Detalle: “ + [Link]());
}
} catch (SQLException ex) {
[Link](“Error al conectar con la base de datos: “
+ [Link]());
}
}
}
4
25. Temas Avanzados en JDBC
2. Batch Processing en JDBC
2.1. Concepto y Ventajas
• Batch Processing:Permite agrupar varias sentencias SQL y ejecutarlas de forma conjunta. Esto mejora el rendimiento
al reducir el número de llamadas a la base de datos, especialmente en operaciones masivas como inserciones o
actualizaciones en grandes volúmenes de datos.
2.2. Ejemplo Práctico: Inserción Masiva con Batch Processing
El siguiente ejemplo muestra cómo insertar múltiples registros en una tabla utilizando batch processing:
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class BatchProcessingJDBC {
private static final String URL = “jdbc:mysql://localhost:3306/mi_base”;
private static final String USUARIO = “usuario”;
private static final String CONTRASENA = “contrasena”;
public static void main(String[] args) {
// Ejemplo: lista de productos a insertar
List<Producto> listaProductos = [Link](
new Producto(“Producto A”, 25.50),
new Producto(“Producto B”, 40.00),
new Producto(“Producto C”, 15.75)
);
String sql = “INSERT INTO productos (nombre, precio) VALUES (?, ?)”;
try (Connection conn = [Link](URL, USUARIO,
CONTRASENA);
PreparedStatement pstmt = [Link](sql)) {
[Link](false); // Manejo manual de la transacción
for (Producto prod : listaProductos) {
[Link](1, [Link]());
[Link](2, [Link]());
[Link]();
}
5
25. Temas Avanzados en JDBC
// Ejecutar el batch y confirmar la transacción
int[] resultados = [Link]();
[Link]();
[Link](“Batch ejecutado. Filas afectadas: “ + re-
[Link]);
} catch (SQLException e) {
[Link](“Error en batch processing: “ + [Link]-
sage());
}
}
}
// Clase Producto de ejemplo
class Producto {
private String nombre;
private double precio;
public Producto(String nombre, double precio) {
[Link] = nombre;
[Link] = precio;
}
public String getNombre() { return nombre; }
public double getPrecio() { return precio; }
}
3. Uso de CallableStatement y Procedimientos Almacenados
3.1. Concepto y Aplicaciones
• CallableStatement:Se utiliza para invocar procedimientos almacenados y funciones definidas en la base de datos.
Esto permite encapsular la lógica de negocio en el lado del servidor, lo que puede mejorar el rendimiento y la segu-
ridad.
• Ventajas:
• Reutilización de código a nivel de base de datos.
• Mayor eficiencia en operaciones complejas.
• Reducción de la lógica de negocio en la capa de aplicación.
3.2. Ejemplo Práctico: Llamada a un Procedimiento Almacenado
Imaginemos que en la base de datos existe un procedimiento almacenado llamado actualizar_stock que actualiza
el stock de un producto. El siguiente ejemplo ilustra cómo invocarlo desde Java:
6
25. Temas Avanzados en JDBC
import [Link];
import [Link];
import [Link];
import [Link];
public class CallableStatementJDBC {
private static final String URL = “jdbc:mysql://localhost:3306/mi_base”;
private static final String USUARIO = “usuario”;
private static final String CONTRASENA = “contrasena”;
public static void main(String[] args) {
try (Connection conn = [Link](URL, USUARIO,
CONTRASENA);
CallableStatement cstmt = [Link](“{call actualizar_
stock(?, ?)}”)) {
// Configuración de parámetros: id del producto y la cantidad a
actualizar
[Link](1, 101);
[Link](2, 20);
// Ejecutar el procedimiento almacenado
[Link]();
[Link](“Procedimiento almacenado ejecutado cor-
rectamente.”);
} catch (SQLException e) {
[Link](“Error al ejecutar el procedimiento almace-
nado: “ + [Link]());
}
}
}
4. Buenas Prácticas en Temas Avanzados de JDBC
• Gestión de Transacciones:
• Siempre desactivar el autocommit cuando se realicen operaciones que deban ejecutarse de forma atómica.
• Utilizar bloques try-catch para capturar errores y ejecutar rollback en caso de fallos.
• Batch Processing:
• Utilizar batch processing para operaciones repetitivas y masivas, validando el tamaño del batch para evitar sobre-
cargar la memoria.
• Uso de CallableStatement:
• Validar y gestionar los parámetros de entrada y salida de los procedimientos almacenados.
• Documentar la lógica implementada en la base de datos para facilitar el mantenimiento.
7
25. Temas Avanzados en JDBC
• Pool de Conexiones:
• Considerar la implementación de un pool de conexiones (por ejemplo, HikariCP o Apache DBCP) en aplicaciones
de gran escala para optimizar la gestión de recursos.
5. Test de Autoevaluación
1. Transacciones:
• Explica la importancia de utilizar transacciones en aplicaciones que realizan múltiples operaciones sobre la base
de datos. ¿Qué diferencias hay entre commit y rollback?
2. Batch Processing:
• ¿Cuáles son las ventajas de utilizar batch processing en operaciones masivas y cómo se implementa en JDBC?
3. CallableStatement:
• Describe el uso de CallableStatement para ejecutar un procedimiento almacenado. ¿Qué ventajas ofrece frente a
ejecutar una sentencia SQL directa?
4. Buenas Prácticas:
• Menciona dos buenas prácticas a seguir al gestionar transacciones y batch processing para evitar problemas de
rendimiento y garantizar la integridad de los datos.