Está en la página 1de 26

Escuela Politécnica Superior

Grado en Ingeniería Informática

Aplicaciones de Bases de Datos


Tema 4.
JDBC como caso de estudio de API de
conectividad de Base de Datos

Docentes:

Jesús Maudes
Raúl Marticorena
Mario Martínez
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Objetivos

Conocer una API básica de conexión a bases de datos.

Practicar con el tipo de conexión vía JNDI.

Conocer y practicar con los pool de conexiones.

Comprender la problemática de la discordancia de tipos (impedance
missmatch) entre bases de datos relaciones.

Trabajar con sentencias preparadas para evitar inyecciones SQL y
optimizar el rendimiento de las aplicaciones.

Comprender y utilizar cachés de sentencias asociadas al pool.

Programar transacciones de forma óptima, manejar correctamente las
excepciones y la liberación de recursos utilizados por la transacción.

Combinar la programación en el lado cliente con llamadas a
procedimientos almacenados.
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Introducción a JDBC

● ¿Java DataBase Connectivity vs. MS-ODBC?


● Driver JDBC j. a
r
c 4
b
j. d
1

ar
70
-

7. j
4 4 .jar
. db2 jc c
-l 8
bc
sq ojd
r e i n .ja r.jar
t g -5 .1.5-b
o s n e c tor-jav a
p con
sq mysql-
ljd
bc
. ja
r
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Introducción a JDBC
Las aplicaciones no
dependen del Driver

java.sql

javax.sql

ojdbc.sql
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Tipos de Drivers JDBC


Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Tipos de conexiones JDBC



●Vía
Víaclase
claseDriveManager
DriveManager
● Vía clase DataSource
Usando
UsandoClassForName
ClassForName<driver>
<driver>
● Vía clase DataSource Sin
SinClassForName
ClassForName
–– Sin JNDI
Sin JNDI
–– Con JNDI
Con JNDI
No
NoPooled
PooledCennection
Cennection
Pooled Formando
Formandoun
unString
Stringcon
conlas
laspropiedades
PooledConnection
Connection Usando Properties para la
propiedades
propiedades
Usando Properties para la propiedades
Usando
Usandosetters
setterspara
paralalapropiedades
propiedades
Usando
Usandocombinaciones
combinacionesde delos
losanteriores
anteriores

Oracle
Oraclethin
thin(tipo
(tipo4)4)Cliente
ClienteooServidor
Servidor
Oracle OCI (tipo 2)
Oracle OCI (tipo 2)
Oracle
OracleKPRB
KPRB(driver
(driverinterno
internotipo
tipo2)
2)
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Transacción “tipo” en JDBC


1)Solicitar una conexión a una fábrica de
conexiones
2)Lanzar operaciones DML a través de dicha
conexión
3)Cerrar la transacción
● COMMIT
● ROLLBACK
4)Cerrar la conexión
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

java.sql.DriveManager
javax.sql.DataSource
● DriveManager
– Simple pero en desuso
– Históricamente relevante
● DataSource
– Más eficiente para aplicaciones con múltiples
conexiones (Pool de conexiones)
– Sencillez de configuración (Parámetros de la
conexión)
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Pool de conexiones
● Gestión de conexiones concurrentes a la BBDD
● Ventajas
– Reutilización de conexiones
– Velocidad apertura/cierra
● Conexión física
● Conexión lógica
● Implementación Oracle → UCP
– PoolDataSource
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Diagrama UML de clases usadas


Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource

import javax.sql.DataSource; Upc.jar

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

PoolDataSource pds = PoolDataSourceFactory.getPoolDatasource();


pds.setConnectionFactoryClassName(
“oracle,jdbc,pool.OracleDataSource”);
ojdbc7.jar
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Cadenas de conexión
● URL con información sobre la conexión

“jdbc:oracle:thin:hr/hr@localhost:1521:xe”

– Protocolo de la URL
– Driver utilizado
– Tipo de driver utilizado
– Usuario y contraseña para la conexión
– Host y puerto al que conectar
– Instancia de la BBDD
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource

import javax.sql.DataSource;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

PoolDataSource pds = PoolDataSourceFactory.getPoolDatasource();


pds.setConnectionFactoryClassName(
“oracle,jdbc,pool.OracleDataSource”);

//Configurar el pool
pds.setURL(“jdbc:oracle:thin:hr/hr@localhost:1521:xe”);
pds.setMinPoolSize(3);
pds.setMaxPoolSize(10);
pds.setInitialPoolSize(5);
pds.setTimetoLiveConnectionTimeOut(1800);
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource

import javax.sql.DataSource;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

PoolDataSource pds = PoolDataSourceFactory.getPoolDatasource();


pds.setConnectionFactoryClassName(
“oracle,jdbc,pool.OracleDataSource”);

//Configurar el pool
pds.setURL(“jdbc:oracle:thin:hr/hr@localhost:1521:xe”);
pds.setMinPoolSize(3);
pds.setMaxPoolSize(10); Poca portabilidad a
pds.setInitialPoolSize(5); otro SGBD
Pds.setTimetoLiveConnectionTimeOut(1800);
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexión mediante un
Pool de conexiones
Ucp.jar
● Instanciar PoolDataSource.
PoolDataSource pds = PoolDataSource.getPoolDataSource();
ojdbc6.jar
● Especificar la fábrica.
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");

● Añadir la cadena de conexión


pds.setURL("jdbc:oracle:thin:hr/hr@localhosthr/hr@localhost:1521:xe");

● Asignar propiedades al pool


pds.setMinPoolSize(30);
pds.setMaxPoolSize(100);
pds.setInitialPoolSize(50);
pds.setTimeToLiveConnectionTimeout(18000);
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource


import javax.sql.DataSource;
import java.sql.Connection;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

PoolDataSource pds = PoolDataSourceFactory.getPoolDatasource();


pds.setConnectionFactoryClassName(“oracle,jdbc,pool.OracleDataSource”);
//Configurar el pool
pds.setURL(“jdbc:oracle:thin:hr/hr@localhost:1521:xe”);
pds.setMinPoolSize(3); pds.setMaxPoolSize(10);
pds.setInitialPoolSize(5);pds.setTimetoLiveConnectionTimeOut(1800);

Connection conn = pds.getConnection();


//Configurar la conexión
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.READ_COMMITTED);
… //Operaciones DML(SELECT, INSERT etc ...)
conn.close();
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource


import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Exception;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;
try {
PoolDataSource pds = PoolDataSourceFactory.getPoolDatasource();
pds.setConnectionFactoryClassName(“oracle,jdbc,pool.OracleDataSource”);
//Configurar el pool
pds.setURL(“jdbc:oracle:thin:hr/hr@localhost:1521:xe”);
pds.setMinPoolSize(3); pds.setMaxPoolSize(10);
pds.setInitialPoolSize(5);pds.setTimetoLiveConnectionTimeOut(1800);

Connection conn = pds.getConnection();


//Configurar la conexión
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.READ_COMMITTED);
… //Operaciones DML(SELECT, INSERT etc ...)
conn.close();
} catch (SQLException e) { … }
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Conexion con DataSource


/*
La idea es que el Pool esté creado al arrancar la aplicación
=> sólo crearlo una vez (patrón Singleton)
*/

try {
Connection conn = pds.getConnection();
//Configurar la conexión
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.READ_COMMITTED);
… //Operaciones DML(SELECT, INSERT etc ...)
conn.close();
} catch (SQLException e) { … }
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Qué es JNDI
● Java Naming and Directory Interface
● API de Java que provee servicios de directorio
– i.e. DNS, ActiveDirectory
● Acceso a recursos en base a nombres
● Información organizada en contextos
– Estructura independiente
– Mantiene información sobre un entorno
– Con un nombre asignado (bind)
– Accesible mediante su nombre (lookup)
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Crear contexto JNDI [1/2]


public static void reconfigurarPool() javax,naming.Context
throws NamingException, SQLException { javax.naming.InitialContext
javax.naming.NamingException

Properties properties = new Properties();


properties.setProperty
(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
fscontext-*.jar
properties.setProperty
(Context.PROVIDER_URL, "file:./res");

Context context = new InitialContext(properties);


[...]
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Guardar pds en contexto JNDI [2/2]


[...]
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName(
"oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:hr/hr@localhost:1521:xe");
pds.setMinPoolSize(3);
pds.setMaxPoolSize(10);
pds.setInitialPoolSize(5);
pds.setTimeToLiveConnectionTimeout(18000);
context.rebind("jdbc/testdb_pooled", pds); }
El mismo .bindings vale para todas las
prácticas!! Mostrar ./res/.bindings
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Recuperar pds con JNDI


private PoolDeConexiones() {//Ojo constructor privado
try{
Properties properties = new Properties();
properties.setProperty(
Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
properties.setProperty(
Context.PROVIDER_URL, "file:./res");
Context context = new InitialContext(properties);
pds = (DataSource)context.lookup("jdbc/testdb_pooled");
}
} Recuperamos la portabilidad respecto SGBD
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Implementar Singleton

public static PoolDeConexiones getInstance(){


if (poolDeConexiones == null) {
poolDeConexiones = new PoolDeConexiones();
}
return poolDeConexiones;
}

//En una transaccion comenzaremos así:


PoolDeConexiones p=PoolDeconexiones.getInstances();
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Obtener una conexión


public Connection getConnection() throws SQLException {
Connection conn = null;
conn = ds.getConnection();

conn.setAutoCommit(false);
conn.setTransactionIsolation(
Connection.TRANSACTION_READ_COMMITTED);
//Connection.TRANSACTION_SERIALIZABLE);

return conn;
}
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Transacción “tipo” en JDBC


1)Solicitar una conexión a una fábrica de conexiones
PoolDeConexiones p=PoolDeconexiones.getInstances();
Connection conn=p.getConnection();
2)Lanzar operaciones DML a través de dicha conexión
3)Cerrar la transacción
– conn.commit();
– conn.rollback();
4)Cerrar la conexión
– conn.close();
Aplicaciones de Bases de Datos
Grado en Ingeniería Informática

Licencia
Autores:
Jesús Maudes & Raúl Marticorena & Mario Martínez
Área de Lenguajes y Sistemas Informáticos
Departamento de Ingeniería Informática
Escuela Politécnica Superior
UNIVERSIDAD DE BURGOS

Este obra está bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported.
No se permite un uso comercial de esta obra ni de las posibles obras derivadas, la distribución de las cuales se debe
hacer con una licencia igual a la que regula esta obra original

Licencia disponible en http://creativecommons.org/licenses/by-nc-sa/3.0/

También podría gustarte