JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la...

103

Click here to load reader

Transcript of JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la...

Page 1: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

JDBCJDBC

Acceso a B.B.D.D. con JavaAcceso a B.B.D.D. con Java

Page 2: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Arquitectura de la Arquitectura de la aplicaciónaplicación Elegir la arquitectura de la Elegir la arquitectura de la

aplicaciónaplicación Es uno de los pasos más importantes al Es uno de los pasos más importantes al

crear una aplicacióncrear una aplicación Se caracteriza por el número de capas Se caracteriza por el número de capas

que componen la aplicaciónque componen la aplicación Tradicionalmente, se ha optado por los Tradicionalmente, se ha optado por los

modelos de dos capas y el de n-capasmodelos de dos capas y el de n-capas

Page 3: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Modelo de dos capasModelo de dos capas

Es el marco de trabajo tradicional cliente-Es el marco de trabajo tradicional cliente-servidorservidor Requiere que el cliente tenga cuidado Requiere que el cliente tenga cuidado

específico de la B.B.D.D.específico de la B.B.D.D. Esto genera un fuerte acoplamiento de las Esto genera un fuerte acoplamiento de las

capas.capas. Ventajas:Ventajas:

Tiempo de desarrollo menor (mayor Tiempo de desarrollo menor (mayor simplicidad)simplicidad)

Mayor rendimiento del sistema (aprovechando Mayor rendimiento del sistema (aprovechando fun-cionalidades específicas del servidor)fun-cionalidades específicas del servidor)

Page 4: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Modelo de dos capasModelo de dos capas

Desventajas:Desventajas: Dificultad en el mantenimiento del sistemaDificultad en el mantenimiento del sistema

Los cambios en el servidor afectan al clienteLos cambios en el servidor afectan al cliente Cambios en la B.B.D.D. requieren modificar Cambios en la B.B.D.D. requieren modificar

código en el clientecódigo en el cliente La propagación de los cambios puede ser muy La propagación de los cambios puede ser muy

difícildifícil

Uso recomendado:Uso recomendado: LAN corporativaLAN corporativa Evaluación de opciones en prototipo de Evaluación de opciones en prototipo de

proyectoproyecto

Page 5: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Modelo de n-CapasModelo de n-Capas

Tiene las siguientes capas:Tiene las siguientes capas: Capa clienteCapa cliente Al menos una capa servidorAl menos una capa servidor Al menos una capa intermediaAl menos una capa intermedia

Diferencias con el modelo de 2 capasDiferencias con el modelo de 2 capas La capa intermedia conecta con la La capa intermedia conecta con la

B.B.D.D.B.B.D.D. Los clientes sólo tienen que saber Los clientes sólo tienen que saber

conectar con la capa intermediaconectar con la capa intermedia Suele ser más sencillo de mantenerSuele ser más sencillo de mantener

Page 6: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Modelo de n-CapasModelo de n-Capas

Ventajas:Ventajas: El sistema se puede escalar más El sistema se puede escalar más

fácilmentefácilmente Soporte más sencillo para Soporte más sencillo para

autentificación e interna-cionalizaciónautentificación e interna-cionalización Desventajas:Desventajas:

Mayor complejidad del sistemaMayor complejidad del sistema

Page 7: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

La API de JDBC proporciona una serie La API de JDBC proporciona una serie de interfaces para manejar la de interfaces para manejar la B.B.D.D.B.B.D.D.

Los vendedores de drivers JDBC nos Los vendedores de drivers JDBC nos proporcio-nan la implementación real proporcio-nan la implementación real de las interfacesde las interfaces

Sun mantiene una base de datos de Sun mantiene una base de datos de driversdrivers http://developers.sun.com/product/jdbc/http://developers.sun.com/product/jdbc/

driversdrivers

Page 8: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Arquitectura JDBCArquitectura JDBC

La filosofía de JDBC es proporcionar transparencia La filosofía de JDBC es proporcionar transparencia al desarrollador frente al gestor de BD.al desarrollador frente al gestor de BD.

JDBC utiliza un JDBC utiliza un Gestor de ControladoresGestor de Controladores que hace que hace de interfaz con el controlador específico de la BD.de interfaz con el controlador específico de la BD.

Driver Manager de JDBC

ControladorOracle

BD

ControladorJDBC-ODBC

ControladorDB2

Aplicación Java

BDBDSGBDOracle Access

SGBDDB2

Page 9: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Hay dos clases principales responsables Hay dos clases principales responsables del establecimiento de una conexión con del establecimiento de una conexión con B.B.D.D.B.B.D.D. DriverManagerDriverManager

Proporcionada por el API JDBCProporcionada por el API JDBC Responsable de manejar un almacén de drivers Responsable de manejar un almacén de drivers

registradosregistrados Abstrae los detalles de uso de un driverAbstrae los detalles de uso de un driver

Clase real del Driver JDBCClase real del Driver JDBC Proporcionada por vendedores independientesProporcionada por vendedores independientes Responsable de establecer la conexión y manejar Responsable de establecer la conexión y manejar

todas las comunicaciones con la B.B.D.D.todas las comunicaciones con la B.B.D.D.

Page 10: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Tipos de controladoresTipos de controladores

JDBC es una especificación que establece JDBC es una especificación que establece dos tipos de interfaces:dos tipos de interfaces: Interfaz de aplicaciónInterfaz de aplicación, que permite acceder a , que permite acceder a

una base de datos independientemente de su una base de datos independientemente de su fabricante.fabricante.

Interfaz del controladorInterfaz del controlador, al cual se deben , al cual se deben adaptar los desarrolladores de controladores.adaptar los desarrolladores de controladores.

Actualmente en el mercado existen gran Actualmente en el mercado existen gran cantidad de controladores que varían en cantidad de controladores que varían en su arquitectura. Sun ha clasificado estos su arquitectura. Sun ha clasificado estos controladores en cuatro tipos.controladores en cuatro tipos. http://industry.java.sun.com/products/jdbc/driv

ers

Page 11: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Controlador Tipo 1Controlador Tipo 1

Puente JDBC-ODBCPuente JDBC-ODBC

Cliente

Servidor

Cliente BD Java

JDBC ODBC

Serv.ODBC

BD

Protocolo ODBC

Serv.ODBC

BDProtocolo ODBC

Page 12: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Controlador Tipo 2Controlador Tipo 2

Controlador utilizando APIs nativasControlador utilizando APIs nativas

Cliente

Servidor

Cliente BD Java

JDBCAPI

nativa

Serv.nativo

BD

Protocolo nativo

Page 13: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Controlador Tipo 3Controlador Tipo 3

Controlador JDBC-NET Java puroControlador JDBC-NET Java puro

Cliente

Servidor

Cliente BD Java

JDBC

Serv.nativo

BD

BD

Serv.JDBC

Serv.nativo

Serv.JDBC

Protocolo estándar

Protocolo estándar

Page 14: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Controlador Tipo 4Controlador Tipo 4

Controlador Java puro y protocolo Controlador Java puro y protocolo nativonativo

Cliente

Servidor

Cliente BD Java

JDBC

Serv.nativo

BD

Protocolo nativo

Page 15: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Clases e interfaces JDBCClases e interfaces JDBC

La especificación JDBC incluye 8 interfaces La especificación JDBC incluye 8 interfaces y 10 clases, en el paquete estándar y 10 clases, en el paquete estándar java.sqljava.sql..

Podemos dividirlos en los siguientes grupos:Podemos dividirlos en los siguientes grupos: Nucleo de JDBC, interfaces y clases que todos los Nucleo de JDBC, interfaces y clases que todos los

controladores deben implementar.controladores deben implementar. Extensiones al paquete java.lang, extensiones Extensiones al paquete java.lang, extensiones

para SQL.para SQL. Extensiones al paquete java.util, son extensiones Extensiones al paquete java.util, son extensiones

a java.util.Date.a java.util.Date. Metadatos para SQL, permiten examinar Metadatos para SQL, permiten examinar

dinámicamente las propiedades de BD y dinámicamente las propiedades de BD y controladores.controladores.

Page 16: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Núcleo de JDBCNúcleo de JDBC

Estos interfaces se utilizarán el 90% de las veces que Estos interfaces se utilizarán el 90% de las veces que trabajemos con una BD.trabajemos con una BD.

Driver<<Interface>>

Connection<<Interface>>

Statement<<Interface>>

ResultSet<<Interface>>

DriverManager

DriverPropertyInfo CallableStatement<<Interface>>

PreparedStatement<<Interface>>

ResultSetMetaData<<Interface>>

Page 17: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Registrar un driver JDBCRegistrar un driver JDBC Es el primer paso para crear una conexiónEs el primer paso para crear una conexión Mecanismo de conexión tradicional:Mecanismo de conexión tradicional:

La conexión y todas las comunicaciones con la La conexión y todas las comunicaciones con la BBDD son controladas por un objeto BBDD son controladas por un objeto DriverManagerDriverManager

Para establecer una conexión, debemos Para establecer una conexión, debemos registrar un driver JDBC adecuado para la registrar un driver JDBC adecuado para la BBDD objetivo con el objeto DriverManagerBBDD objetivo con el objeto DriverManager

Los drivers JDBC se registran Los drivers JDBC se registran automáticamente a sí mismos con el objeto automáticamente a sí mismos con el objeto DriverManager cuando se cargan en la JVMDriverManager cuando se cargan en la JVM

Page 18: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Cómo registrar un driverCómo registrar un driverStaticStatic

{{

java.sql.DriverManager.registerDriver(nejava.sql.DriverManager.registerDriver(new com.persistentjava.JdbcDriver());w com.persistentjava.JdbcDriver());

}} Registrar un driver es tan simple Registrar un driver es tan simple

como cargar la clase del driver en la como cargar la clase del driver en la JVM, lo cual podemos hacer de varias JVM, lo cual podemos hacer de varias maneras.maneras.

Page 19: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Con el ClassLoader:Con el ClassLoader:Class.forName(com.persistentjava.JdbcDriver);Class.forName(com.persistentjava.JdbcDriver);

Mediante la propiedad del sistema Mediante la propiedad del sistema jdbc.drivers:jdbc.drivers: Desde la línea de comandos:Desde la línea de comandos:

java –java –Djdbc.drivers=com.persistentjava.JdbcDriver Djdbc.drivers=com.persistentjava.JdbcDriver ConnectConnect

Desde dentro de la aplicación JavaDesde dentro de la aplicación Java System.setProperty(“jdbc.drivers”,”com.persisSystem.setProperty(“jdbc.drivers”,”com.persis

tentjava.JdbcDriver”);tentjava.JdbcDriver”);

Page 20: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Mediante el fichero de propiedades del Mediante el fichero de propiedades del sistemasistema

Método de registro genéricoMétodo de registro genéricoClass.forName(“com.persistentjava.JdbcDriver”).newInstaClass.forName(“com.persistentjava.JdbcDriver”).newInsta

nce();nce();

DriverManager.registerDriver(new DriverManager.registerDriver(new com.persistentjava.JdbcDriver());com.persistentjava.JdbcDriver());

Debemos rodear este código con un Debemos rodear este código con un manejador de excepciones apropiadomanejador de excepciones apropiado

Page 21: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC Una vez registrado, ya podemos utilizar el Una vez registrado, ya podemos utilizar el

driverdriver ¿Cómo selecciona DriverManager el correcto?¿Cómo selecciona DriverManager el correcto?

Cada driver usa una URL JDBC específicaCada driver usa una URL JDBC específica Tiene el mismo formato que una dirección WebTiene el mismo formato que una dirección Web El formato sirve para identificar el driverEl formato sirve para identificar el driver

Formato: jdbc:sub-protocol:database locatorFormato: jdbc:sub-protocol:database locator El sub-protocolo es específico del driver JDBCEl sub-protocolo es específico del driver JDBC El localizador es un indicador específico del driver El localizador es un indicador específico del driver

para especificar de forma única la BBDD a utilizarpara especificar de forma única la BBDD a utilizar

Page 22: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Proceso de selección:Proceso de selección: Se presenta una URL específicaSe presenta una URL específica DriverManager itera sobre los drivers DriverManager itera sobre los drivers

registradosregistrados Cuando uno de ellos reconoce la URL, para.Cuando uno de ellos reconoce la URL, para. Si no se encuentra ningún driver, salta una Si no se encuentra ningún driver, salta una

SQLExceptionSQLException Ejemplos:Ejemplos:

jdbc:oracle:thin:@persistentjava.com:1521:jjdbc:oracle:thin:@persistentjava.com:1521:jdbcdbc

jdbc:db2:jdbcjdbc:db2:jdbc

Page 23: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Muchos drivers, incluido el driver puente Muchos drivers, incluido el driver puente JDBC-ODBC, acepta parámetros JDBC-ODBC, acepta parámetros adicionalesadicionales Nombre de usuarioNombre de usuario ContraseñaContraseña

Para obtener una conexión a una base de Para obtener una conexión a una base de datos, dando una URL JDBC, llamamos a datos, dando una URL JDBC, llamamos a getConnection() en DriverManager:getConnection() en DriverManager: DriverManager.getConnection(url);DriverManager.getConnection(url); DriverManager.getConnection(url,username,passwoDriverManager.getConnection(url,username,passwo

rd);rd);

Page 24: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fundamentos de los drivers Fundamentos de los drivers JDBCJDBC

Significado de los parámetros:Significado de los parámetros: url: Objeto String que es la URL JDBCurl: Objeto String que es la URL JDBC username: Objeto String con el nombre username: Objeto String con el nombre

de usuariode usuario password: Objeto String con la password: Objeto String con la

contraseñacontraseña Podemos encapsular los parámetros Podemos encapsular los parámetros

en un objeto Propertiesen un objeto Properties DriverManager.getConnection(url, DriverManager.getConnection(url,

dbproperties);dbproperties);

Page 25: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

: DriverM anager

Cliente

getC onnection( )

: C onnec tion

Conexión a la BD

Obtener Obtener conexión BDconexión BD

Page 26: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

: DriverM anager

Cliente

getC onnection( )

: C onnec tion

crea teStatem ent( )

: Sta tem ent

Obtener el objeto Statement

Crear sentencia Crear sentencia de BDde BD

Page 27: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

: DriverM anager

Cliente

getC onnection( )

: C onnec tion

crea teStatem ent( )

: Sta tem ent

executeQ uery( )

: R esu ltS et

Ejecutar la consulta

Ejecutar Ejecutar consultaconsulta

Page 28: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

: DriverM anager

Cliente

getC onnection( )

: C onnec tion

crea teStatem ent( )

: Sta tem ent

executeQ uery( )

: R esu ltS et

next( )

getIn t( )

getString( )

getB igD ecim al( )

Posicionar el cursor en la siguiente fila

Recuperar valores de las columnas.Repetir mientras

haya filas que procesar. Recuperación valores Recuperación valores

resultadoresultado

Page 29: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

: DriverM anager

Cliente

getC onnection( )

: C onnec tion

crea teStatem ent( )

: Sta tem ent

executeQ uery( )

: R esu ltS et

next( )

getIn t( )

getString( )

getB igD ecim al( )

c lose( )

c lose( )

Liberar el objeto Connection

Liberar el objeto Statement

Liberar Liberar objetosobjetos

Page 30: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Tipos SQL – Tipos JavaTipos SQL – Tipos Java

Types.BITTypes.BIT booleanbooleanTypes.TINYINTTypes.TINYINT bytebyteTypes.SMALLINTTypes.SMALLINT shortshortTypes.INTEGERTypes.INTEGER intintTypes.BIGINTTypes.BIGINT longlongTypes.FLOATTypes.FLOAT doubledoubleTypes.REALTypes.REAL floatfloatTypes.DOUBLETypes.DOUBLE doubledoubleTypes.NUMERICTypes.NUMERIC java.math.BigDecimaljava.math.BigDecimalTypes.DECIMALTypes.DECIMAL java.math.BigDecimaljava.math.BigDecimalTypes.CHARTypes.CHAR java.lang.Stringjava.lang.StringTypes.VARCHARTypes.VARCHAR java.lang.Stringjava.lang.StringTypes.LONGVARCHARTypes.LONGVARCHAR java.lang.Stringjava.lang.StringTypes.DATETypes.DATE java.sql.Datejava.sql.DateTypes.TIMTypes.TIM java.sql.Timejava.sql.TimeTypes.BINARYTypes.BINARY byte []byte []Types.VARBINARYTypes.VARBINARY byte []byte []

Page 31: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Consultar la B.B.D.D.Consultar la B.B.D.D.

Para recuperar la información de una Para recuperar la información de una B.B.D.D. se utiliza la clase StatementB.B.D.D. se utiliza la clase Statement

Un objeto Statement se crea a partir Un objeto Statement se crea a partir de una conexión y tiene varios métodos de una conexión y tiene varios métodos para hacer consultas a la B.B.D.D.para hacer consultas a la B.B.D.D.

public void obtenerDatosTabla() public void obtenerDatosTabla() {{

st =con.createStatement()st =con.createStatement();;rs = st.executeQuery("SELECT * FROM Usuarios ORDER rs = st.executeQuery("SELECT * FROM Usuarios ORDER BY Nombre DESC");BY Nombre DESC");System.out.println("Tabla abierta"); System.out.println("Tabla abierta");

}}

Page 32: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Ejecución de la sentenciaEjecución de la sentencia

executeQuery(),executeQuery(), ejecución de consultas, ejecución de consultas, sentencia SELECT.sentencia SELECT.

executeUpdate(),executeUpdate(), actualizaciones de actualizaciones de valores en al base de datos. INSERT, valores en al base de datos. INSERT, UPDATE, DELETE. Sólo devuelve la UPDATE, DELETE. Sólo devuelve la cuenta de las columnas afectadas.cuenta de las columnas afectadas.

execute(),execute(), se usa para ejecutar sentencias se usa para ejecutar sentencias que no se conocen a priori o que que no se conocen a priori o que devuelven resultados no homogéneos.devuelven resultados no homogéneos.

Page 33: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Consultar la B.B.D.D.Consultar la B.B.D.D.

Una sentencia creada de esta forma Una sentencia creada de esta forma devuelve un ResultSet en el que sólo devuelve un ResultSet en el que sólo puede haber desplaza-miento hacia puede haber desplaza-miento hacia delante.delante.

Para movernos por el ResultSet Para movernos por el ResultSet utilizamos:utilizamos: El método next() para avanzar entre los El método next() para avanzar entre los

registrosregistros Métodos específicos para obtener cada Métodos específicos para obtener cada

campocampo Estos métodos tienen el formato getXXXX()Estos métodos tienen el formato getXXXX()

Page 34: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Objetos involucrados en Objetos involucrados en el acceso a datos el acceso a datos (diagrama (diagrama de colaboración)de colaboración)

ProgramaJava

Objeto Driver JDBC BD

Base dedatos

ObjetoConnection

ObjetoStatement

SQL

ResultadosObjeto

ResultSet

Page 35: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Tipos de ResultSetTipos de ResultSet

Por capacidad de desplazamientoPor capacidad de desplazamiento TYPE_FORWARD_ONLYTYPE_FORWARD_ONLY

Desplazables sólo hacia delanteDesplazables sólo hacia delante TYPE_SCROLL_INSENSITIVETYPE_SCROLL_INSENSITIVE

Desplazables en ambos sentidosDesplazables en ambos sentidos TYPE_SCROLL_SENSITIVETYPE_SCROLL_SENSITIVE

Desplazable en ambos sentidosDesplazable en ambos sentidos Sensible a las modificaciones realizadas a Sensible a las modificaciones realizadas a

los datos después de tomado el ResultSetlos datos después de tomado el ResultSet

Page 36: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Tipos de ResultSetTipos de ResultSet

Por capacidad de actualizaciónPor capacidad de actualización Por defecto, los ResultSet son de sólo Por defecto, los ResultSet son de sólo

lecturalectura JDBC 2.1 introduce el tipo actualizableJDBC 2.1 introduce el tipo actualizable CONCUR_READ_ONLYCONCUR_READ_ONLY

Sólo lecturaSólo lectura CONCUR_UPDATABLECONCUR_UPDATABLE

Actualizables; permiten inserción, actualización Actualizables; permiten inserción, actualización y eliminación.y eliminación.

Utiliza los métodos updateXXX() para actualizar Utiliza los métodos updateXXX() para actualizar los datos de la fila actualmente seleccionadalos datos de la fila actualmente seleccionada

Page 37: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Métodos de un ResultSetMétodos de un ResultSet

MétodoMétodo Tipo DevueltoTipo DevueltogetIntgetInt INTEGERINTEGERgetLonggetLong BIG INTBIG INTgetFloatgetFloat REALREALgetDoublegetDouble FLOATFLOATgetBignumgetBignum DECIMALDECIMALgetBooleangetBoolean BITBITgetStringgetString VARCHARVARCHARgetStringgetString CHARCHARgetDategetDate DATEDATEgetTimegetTime TIMETIMEgetTimesstampgetTimesstamp TIME STAMPTIME STAMPgetObjectgetObject cualquier tipocualquier tipo

Page 38: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Métodos de un ResultSetMétodos de un ResultSet

Para cada método getXXXX(), el driver Para cada método getXXXX(), el driver JDBC debe hacer conversiones de tipo JDBC debe hacer conversiones de tipo entre el de la B.B.D.D. y el tipo Java entre el de la B.B.D.D. y el tipo Java equivalente.equivalente.

El driver no permite conversiones El driver no permite conversiones inválidas, aunque sí leer todos los inválidas, aunque sí leer todos los tipos con getString().tipos con getString().

El método next():El método next(): Avanza al siguiente registroAvanza al siguiente registro Devuelve false si no hay más registrosDevuelve false si no hay más registros

Page 39: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Recorrer un ResultSetRecorrer un ResultSet

public void mostrarDatosUsuario() public void mostrarDatosUsuario() {{

while (rs.next()) while (rs.next()) {{

String strNombre = String strNombre = rs.getString(“Nombre");rs.getString(“Nombre");

String strPassword = String strPassword = rs.getString(“Password");rs.getString(“Password");

long longID = rs.getInt(“ID");long longID = rs.getInt(“ID");System.out.println(strNombre + ", " System.out.println(strNombre + ", "

+ strPassword + strPassword + ", " + longID);+ ", " + longID);}}

}}

Page 40: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Conjunto de resultados Conjunto de resultados desplazabledesplazable

Recorrido básico del ResultSet: Recorrido básico del ResultSet: cursorcursor hacia delante, de fila en fila y hacia delante, de fila en fila y desde la primera fila desde la primera fila next(). next().

Podemos acceder a las filas del Podemos acceder a las filas del ResultSet de más formas (JDBC 2.0), ResultSet de más formas (JDBC 2.0), como un índice de un array.como un índice de un array.

Page 41: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Creación de la sentencia para Resultset Creación de la sentencia para Resultset desplazabledesplazable

Cambio en la creación del objeto Cambio en la creación del objeto sentencia:sentencia: createStatement(createStatement(int tipoResultSet, int int tipoResultSet, int concurrenciaResultSetconcurrenciaResultSet))

tipoResultSettipoResultSet es el que permite flexibilidad es el que permite flexibilidad en el desplazamiento.en el desplazamiento.

Valores:Valores: TYPE_FORWARD_ONLY, sólo hacia delanteTYPE_FORWARD_ONLY, sólo hacia delante TYPE_SCROLL_INSENSITIVETYPE_SCROLL_INSENSITIVE, ,

TYPE_SCROLL_SENSITIVETYPE_SCROLL_SENSITIVE, métodos de , métodos de posicionamiento habilitadosposicionamiento habilitados

Page 42: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Métodos de desplazamiento Métodos de desplazamiento del cursordel cursor

MétodosMétodos Movimiento hacia atrás: afterLast(), Movimiento hacia atrás: afterLast(),

previous().previous(). Posicionamiento absoluto: first(), last(), Posicionamiento absoluto: first(), last(),

absolute(numFila).absolute(numFila). Posicionamiento relativo: relative(num).Posicionamiento relativo: relative(num). Recupera fila actual: getRow().Recupera fila actual: getRow().

Page 43: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Conjunto de resultados Conjunto de resultados actualizableactualizable

Para actualizar datos en la BD Para actualizar datos en la BD teníamos que recurrir a sentencias teníamos que recurrir a sentencias SQL: INSERT, UPDATE, DELETE.SQL: INSERT, UPDATE, DELETE.

Podemos realizar actualizaciones Podemos realizar actualizaciones por programa (JDBC 2.0).por programa (JDBC 2.0).

Page 44: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Creación de la sentencia para Resultset Creación de la sentencia para Resultset actualizableactualizable

Cambio en la creación del objeto Cambio en la creación del objeto sentencia:sentencia: createStatement(createStatement(int tipoResultSet, int int tipoResultSet, int concurrenciaResultSetconcurrenciaResultSet))

concurrenciaResultSetconcurrenciaResultSet es el que permite es el que permite actualizar ResultSet por programa.actualizar ResultSet por programa.

Valores:Valores: CONCUR_READ_ONLY, no se puede actualizar.CONCUR_READ_ONLY, no se puede actualizar. CONCUR_UPDATABLECONCUR_UPDATABLE, permite la utilización de , permite la utilización de

métodos para modificar filas.métodos para modificar filas.

Page 45: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Métodos para actualizar Métodos para actualizar filasfilas Posicionarse en la fila para Posicionarse en la fila para

actualizar.actualizar. Llamar a los métodos de Llamar a los métodos de

actualización de campos:actualización de campos: updateXXX(<campo>,<valor>)updateXXX(<campo>,<valor>)

Para confirmar las actualizaciones Para confirmar las actualizaciones sobre la tabla llamamos a: sobre la tabla llamamos a: updateRow().updateRow().

Page 46: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Insertando y borrando por Insertando y borrando por programaprograma Métodos para insertar filas sin Métodos para insertar filas sin

utilizar SQL:utilizar SQL: moveToInsertRow(), mueve a fila vacía.moveToInsertRow(), mueve a fila vacía. updateXXX(<campo>,<valor>) sobre updateXXX(<campo>,<valor>) sobre

cada campo de la nueva fila.cada campo de la nueva fila. insertRow(), confirma inserción.insertRow(), confirma inserción.

Método para borrar filas sin utilizar Método para borrar filas sin utilizar SQL:SQL: Posicionarnos sobre la fila a borrar.Posicionarnos sobre la fila a borrar. deleteRow().deleteRow().

Page 47: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Información acerca de la base de datos Información acerca de la base de datos (Metadatos)(Metadatos)

Cuando a priori no tenemos información Cuando a priori no tenemos información sobre la estructura de la base de datos sobre la estructura de la base de datos podemos acceder a ella mediante los podemos acceder a ella mediante los metadatos.metadatos.

Esto permite adaptar el acceso que está Esto permite adaptar el acceso que está realizando nuestra aplicación a una BD realizando nuestra aplicación a una BD concreta en tiempo de ejecución.concreta en tiempo de ejecución.

Objeto Connection al que aplicamos el Objeto Connection al que aplicamos el método getMetaData(), que devuelve un método getMetaData(), que devuelve un objeto que implementa la interfaz objeto que implementa la interfaz DatabaseMetaDataDatabaseMetaData..

Page 48: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Metadatos para SQLMetadatos para SQL

Types simplemente contiene constantes con los tipos de datos.Types simplemente contiene constantes con los tipos de datos. DatabaseMetadata, proporciona información sobre la BD.DatabaseMetadata, proporciona información sobre la BD.

Object

DatabaseMetaData<<Interface>>

Types

Page 49: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Información sobre el resultado de una Información sobre el resultado de una consultaconsulta

Muchas veces no conocemos lo que va a Muchas veces no conocemos lo que va a devolver una consulta: devolver una consulta: SELECT * FROM SELECT * FROM UsuariosUsuarios..

JDBC permite obtener un objeto que JDBC permite obtener un objeto que implementa implementa ResultSetMetaDataResultSetMetaData al aplicar al aplicar el método getMetada() a un objeto el método getMetada() a un objeto ResultSet.ResultSet.

De esta forma podemos obtener datos De esta forma podemos obtener datos como número de columnas devueltas y el como número de columnas devueltas y el nombre de una determinada columna.nombre de una determinada columna.

Esto permite la ejecución y recuperación Esto permite la ejecución y recuperación de resultados de forma dinámica.de resultados de forma dinámica.

Page 50: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

MetadatosMetadatos

Ejemplo:Ejemplo:public void estructuraTabla(String strTbl) {public void estructuraTabla(String strTbl) {

Statement st = conn.createStatement();Statement st = conn.createStatement();ResultSet rs = st.executeQuery("Select * from " + strTbl);ResultSet rs = st.executeQuery("Select * from " + strTbl);

//Obtiene el metadata del ResultSet//Obtiene el metadata del ResultSetResultSetMetaData rsmeta = rs.getMetaData();ResultSetMetaData rsmeta = rs.getMetaData();

//Obtiene la cantidad de columnas del ResultSet//Obtiene la cantidad de columnas del ResultSetint col = rsmeta.getColumnCount();int col = rsmeta.getColumnCount();for (int i = 1; i <= col; i++) {for (int i = 1; i <= col; i++) {

System.out.println("Campo " + System.out.println("Campo " + //Devuelve el nombre del campo i//Devuelve el nombre del campo i

rsmeta.getColumnLabel(i) + "\t"rsmeta.getColumnLabel(i) + "\t"//Devuelve el tipo del campo i//Devuelve el tipo del campo i

+ "Tipo: " + rsmeta.getColumnTypeName(i));+ "Tipo: " + rsmeta.getColumnTypeName(i));}}

}}

Page 51: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

MetadatosMetadatos

También podemos utilizar la información del También podemos utilizar la información del ResultSetMetaData para obtener la información ResultSetMetaData para obtener la información de cualquier tabla sin tener la estructura antes.de cualquier tabla sin tener la estructura antes.

public void verCualquierTabla(String strTbl) {public void verCualquierTabla(String strTbl) {

Statement st = conn.createStatement();Statement st = conn.createStatement();

ResultSet rs = st.executeQuery("Select * ResultSet rs = st.executeQuery("Select * from " from "

+ strTbl);+ strTbl);

ResultSetMetaData meta = ResultSetMetaData meta = rs.getMetaData();rs.getMetaData();

int col = meta.getColumnCount();int col = meta.getColumnCount();

Page 52: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

MetadatosMetadatos

//Mientras haya registros//Mientras haya registroswhile (rs.next()) {while (rs.next()) {

for (int i = 1; i <= col; i++) {for (int i = 1; i <= col; i++) {//Mostrar el dato del campo i//Mostrar el dato del campo iSSystem.out.print(rs.getString(i)ystem.out.print(rs.getString(i)

+ "\t");+ "\t");}}System.out.println("");System.out.println("");

}}}}

Page 53: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

MetadatosMetadatos

También podemos obtener información También podemos obtener información sobre el servidor de B.B.D.D. por medio sobre el servidor de B.B.D.D. por medio de la clase DataBaseMetaData.de la clase DataBaseMetaData.

Obtenemos un objeto de este tipo a Obtenemos un objeto de este tipo a través de la clase Connectiontravés de la clase Connection

Información que podemos obtenerInformación que podemos obtener Tipo de base de datosTipo de base de datos Máximo de conexiones que permite la Máximo de conexiones que permite la

B.B.D.D.B.B.D.D. ……

Page 54: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

MetadatosMetadatos

Ejemplo de usoEjemplo de uso

Connection con;Connection con;con=DriverManager.getConnection("...DatosCoches");con=DriverManager.getConnection("...DatosCoches");DataBaseMetaData dbMet = con.getMetaData();DataBaseMetaData dbMet = con.getMetaData();if (dbMet==null)if (dbMet==null)

System.out.println("No hay información de MetaData");System.out.println("No hay información de MetaData");else else {{

System.out.println("Tipo de la BD: System.out.println("Tipo de la BD: "+dbMet.getDataBaseProductName());"+dbMet.getDataBaseProductName());

System.out.println("Versión : System.out.println("Versión : "+dbMet.getDatabaseProductVersion());"+dbMet.getDatabaseProductVersion());

System.out.println(“Máximo de conexiones: System.out.println(“Máximo de conexiones: "+dbMet.getMaxConnectios());"+dbMet.getMaxConnectios());

}}

Page 55: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Manejo de las excepciones Manejo de las excepciones de SQLde SQL SQLExceptionSQLException

Es la principal forma que tiene JDBC de Es la principal forma que tiene JDBC de informar de errores.informar de errores.

Hereda de la clase Exception de java.lang.Hereda de la clase Exception de java.lang. Proporciona la siguiente información sobre el Proporciona la siguiente información sobre el

error:error: Una cadena describiendo el error a la que se puede Una cadena describiendo el error a la que se puede

acceder con el método getMessage().acceder con el método getMessage(). La cadena de error SQLstate de acuerdo con el La cadena de error SQLstate de acuerdo con el

estándar X/Open a la que se puede acceder con el estándar X/Open a la que se puede acceder con el método getSQLState().método getSQLState().

Un código de error entero específico de la BD que se Un código de error entero específico de la BD que se puede acceder con getErrorCode().puede acceder con getErrorCode().

Permite acceder a más errores con Permite acceder a más errores con getNextException().getNextException().

Page 56: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Manejo de los avisos de Manejo de los avisos de SQLSQL SQLWarningSQLWarning

Permite informar de errores leves en distintos Permite informar de errores leves en distintos objetos de la BD: ResultSet, Statement, objetos de la BD: ResultSet, Statement, Connection.Connection.

Al contrario que SQLException no es Al contrario que SQLException no es obligatorio capturar los SQLWarning.obligatorio capturar los SQLWarning.

Para obtener un SQLWarning se llama al Para obtener un SQLWarning se llama al método getWarning() sobre el objeto.método getWarning() sobre el objeto.

Para obtener SQLWarning adicionales se Para obtener SQLWarning adicionales se llama a getNextWarning().llama a getNextWarning().

DataTruncationDataTruncation Informa de avisos de truncado de datos en las Informa de avisos de truncado de datos en las

lecturas y al escribir datos.lecturas y al escribir datos.

Page 57: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Extensiones JDBC al paquete Extensiones JDBC al paquete java.langjava.lang

Amplían envoltorio Number para permitir albergar grandes números.Amplían envoltorio Number para permitir albergar grandes números. Crean clases Exception especializadas.Crean clases Exception especializadas.

Number Exception

BigDecimal SQLException

SQLWarning

DataTruncation

Page 58: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Manejo de excepcionesManejo de excepciones

Ejemplo de uso:Ejemplo de uso:

catchcatch (SQLException sqlException) (SQLException sqlException) {{

whilewhile (sqlException != (sqlException != nullnull) {) {out.println("Error: out.println("Error: “+sqlException.getErrorCode());“+sqlException.getErrorCode());out.println("Detalles: out.println("Detalles: "+sqlException.getMessage());"+sqlException.getMessage());out.println(“Estado: " out.println(“Estado: " +sqlException.getSQLState());+sqlException.getSQLState());sqlException = sqlException.getNextException();sqlException = sqlException.getNextException();}}

}}

Page 59: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Ampliaciones al tratamiento Ampliaciones al tratamiento básico de BDbásico de BD

Versiones JDBCVersiones JDBC JDBC 1.0JDBC 1.0 JDBC 2.0JDBC 2.0

JDBC Optional Package (inicialmente se le JDBC Optional Package (inicialmente se le llamó standard extension API): paquete llamó standard extension API): paquete javax.sql. Es necesario si queremos utilizar javax.sql. Es necesario si queremos utilizar objetos DataSource o Rowset. Está incluido objetos DataSource o Rowset. Está incluido en la J2EE. Si tenemos la J2SE podemos en la J2EE. Si tenemos la J2SE podemos bajarlo por separado.bajarlo por separado.

JDBC 3.0: paquetes java.sql y javax.sql JDBC 3.0: paquetes java.sql y javax.sql está integrado en la plataforma J2SE está integrado en la plataforma J2SE 1.4.1.4.

Page 60: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Características incluye Características incluye JDBC 2.0 (I)JDBC 2.0 (I) El recorrido del ResultSet no se limita al El recorrido del ResultSet no se limita al

avance. avance. Actualización de los datos de la base de Actualización de los datos de la base de

datos mediante métodos.datos mediante métodos. Envío de múltiples sentencias SQL de Envío de múltiples sentencias SQL de

actualización a la BD para que las trate actualización a la BD para que las trate como una unidad (Batch updates).como una unidad (Batch updates).

Utilización de tipos de datos SQL3.Utilización de tipos de datos SQL3. Creación y utilización de nuevos tipos Creación y utilización de nuevos tipos

SQL definidos por el usuario (UDTs).SQL definidos por el usuario (UDTs).

Page 61: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Características incluye JDBC Características incluye JDBC 2.0 (y II)2.0 (y II)

Fuentes de datos como alternativa a Fuentes de datos como alternativa a getConnection.getConnection.

Creación de conexiones como pools Creación de conexiones como pools de conexiones.de conexiones.

RowSets.RowSets.

Page 62: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Una transacción representa una Una transacción representa una

unidad de trabajo lógicaunidad de trabajo lógica La principal responsabilidad de una La principal responsabilidad de una

B.B.D.D. es preservar la informaciónB.B.D.D. es preservar la información Un usuario debe poder salvar el estado Un usuario debe poder salvar el estado

actual del programaactual del programa Igualmente, si algo ha ido mal, debe Igualmente, si algo ha ido mal, debe

poder indicar a una B.B.D.D. que poder indicar a una B.B.D.D. que debería ignorar el estado actual y debería ignorar el estado actual y volver al estado grabado anteriormente.volver al estado grabado anteriormente.

Page 63: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Cuando trabajamos con B.B.D.D., estas Cuando trabajamos con B.B.D.D., estas

funciones se llaman:funciones se llaman: Entregar una transacciónEntregar una transacción Deshacer una transacciónDeshacer una transacción

La API de JDBC incluye dos métodos La API de JDBC incluye dos métodos como parte de la interfaz Connection como parte de la interfaz Connection para ello:para ello: Connection.commit()Connection.commit() Connection.rollback()Connection.rollback()

Pueden lanzar SQLException (rodear con try-Pueden lanzar SQLException (rodear con try-catch)catch)

Page 64: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. En un entorno monousuario, las En un entorno monousuario, las

transacciones son bastante sencillastransacciones son bastante sencillas Ejemplo de transacción multiusuario:Ejemplo de transacción multiusuario:

Cuenta bancariaCuenta bancaria Una aplicación intenta hacer un cargoUna aplicación intenta hacer un cargo Otra aplicación intenta hacer un depósitoOtra aplicación intenta hacer un depósito

Debemos mantener separadas las Debemos mantener separadas las ejecuciones de ambas aplicaciones, ejecuciones de ambas aplicaciones, para que no interfieran entre sípara que no interfieran entre sí

Page 65: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Problemas comunes con accesos Problemas comunes con accesos

concurrentes:concurrentes: Lecturas suciasLecturas sucias

Una aplicación usa datos modificados por otra Una aplicación usa datos modificados por otra aplicaciónaplicación

Estos datos están en un estado sin entregarEstos datos están en un estado sin entregar La segunda aplicación solicita un “rollback”La segunda aplicación solicita un “rollback” Los datos de la primera están corruptos o “sucios”Los datos de la primera están corruptos o “sucios”

Lecturas no-repetiblesLecturas no-repetibles Una transacción obtiene datosUna transacción obtiene datos Estos datos son alterados por una transacción Estos datos son alterados por una transacción

separadaseparada La primera transacción relee los datos alteradosLa primera transacción relee los datos alterados

Page 66: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D.

Lecturas fantasmasLecturas fantasmas Una transacción adquiere datos mediante una Una transacción adquiere datos mediante una

consultaconsulta Otra transacción modifica algunos de los datosOtra transacción modifica algunos de los datos La transacción recupera los datos una segunda vezLa transacción recupera los datos una segunda vez Resulta en dos conjuntos de resultados diferentesResulta en dos conjuntos de resultados diferentes

Niveles de TransacciónNiveles de Transacción Las transacciones están aisladas unas de otras Las transacciones están aisladas unas de otras

por bloqueospor bloqueos Esto resuelve problemas asociados a múltiples Esto resuelve problemas asociados a múltiples

threads solicitando los mismos datosthreads solicitando los mismos datos

Page 67: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. En JDBC hay diferentes tipos de bloqueo:En JDBC hay diferentes tipos de bloqueo:

TRANSACTION_NONETRANSACTION_NONE Las transacciones no están soportadasLas transacciones no están soportadas

TRANSACTION_READ_UNCOMMITEDTRANSACTION_READ_UNCOMMITED Una transacción puede ver los cambios de otra Una transacción puede ver los cambios de otra

transacción antes de ser entregadatransacción antes de ser entregada Permite lecturas sucias, no repetibles y Permite lecturas sucias, no repetibles y

fantasmasfantasmas TRANSACTION_READ_COMMITEDTRANSACTION_READ_COMMITED

La lectura de datos no entregados no está La lectura de datos no entregados no está permitidapermitida

Permite lecturas no repetibles y fantasmasPermite lecturas no repetibles y fantasmas

Page 68: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D.

TRANSACTION_REPEATABLE_READTRANSACTION_REPEATABLE_READ Indica que una transacción está garantizado Indica que una transacción está garantizado

que pueda leer el mismo dato sin fallar. Las que pueda leer el mismo dato sin fallar. Las lecturas fantasmas todavía pueden ocurrir.lecturas fantasmas todavía pueden ocurrir.

TRANSACTION_SERIALIZABLETRANSACTION_SERIALIZABLE Es la transacción de más alto nivelEs la transacción de más alto nivel No permite lecturas sucias, fantasmas ni no No permite lecturas sucias, fantasmas ni no

repetiblesrepetibles El problema es la perdida de rendimientoEl problema es la perdida de rendimiento

Page 69: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. En un objeto Connection podemos En un objeto Connection podemos

seleccionar explicitamente el nivel de seleccionar explicitamente el nivel de transaccióntransacción

Establecimiento del nivel de Establecimiento del nivel de transaccióntransacción Connection.setTransactionLevel(TRANSAConnection.setTransactionLevel(TRANSA

CTION_SERIALIZABLE);CTION_SERIALIZABLE); Obtener el nivel de transacción actualObtener el nivel de transacción actual

If(Connection.getTransactionLevel()==TRIf(Connection.getTransactionLevel()==TRANSACTION_SERIALIZABLE)ANSACTION_SERIALIZABLE)

Page 70: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Por defecto, los drivers JDBC operan Por defecto, los drivers JDBC operan

en modo autoentrega (autocommit)en modo autoentrega (autocommit) Cada comando enviado a la B.B.D.D. Cada comando enviado a la B.B.D.D.

opera en su propia transacciónopera en su propia transacción Util para principiantesUtil para principiantes Implica pérdida de rendimientoImplica pérdida de rendimiento

Para poder controlar explicitamente Para poder controlar explicitamente las entregas y retrocesos (rollback), las entregas y retrocesos (rollback), debemos desactivar el modo debemos desactivar el modo autocommitautocommit

Page 71: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Desactivación del modo autocommit:Desactivación del modo autocommit:

Connection.setAutoCommit(false)Connection.setAutoCommit(false) Determinar el modo autocommit:Determinar el modo autocommit:

if(Connection.getAutoCommit()==true)if(Connection.getAutoCommit()==true) Muchas B.B.D.D. soportan Muchas B.B.D.D. soportan

procesamiento por lotesprocesamiento por lotes Se realizan múltiples operaciones update Se realizan múltiples operaciones update

en una sola operación o loteen una sola operación o lote Disponibles a partir de JDBC 2.0. Sin Disponibles a partir de JDBC 2.0. Sin

autocommit.autocommit.

Page 72: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. Ejemplo de operación por lotesEjemplo de operación por lotes

con.setAutoCommit(false);con.setAutoCommit(false);Statement stmt = con.createStatement();Statement stmt = con.createStatement();stmt.addBatch(“stmt.addBatch(“ INSERT INTO people INSERT INTO people

VALUES (‘Joe Jackson’, 0.325, 25, 105);VALUES (‘Joe Jackson’, 0.325, 25, 105);stmt.addBatch(“stmt.addBatch(“ INSERT INTO people INSERT INTO people

VALUES (‘Jim Jackson’, 0.325, 25, 105);VALUES (‘Jim Jackson’, 0.325, 25, 105);stmt.addBatch(“stmt.addBatch(“ INSERT INTO people INSERT INTO people

VALUES (‘Jack Jackson’, 0.325, 25, 105);VALUES (‘Jack Jackson’, 0.325, 25, 105);int[] updateCounts = stmt.executeBatch();int[] updateCounts = stmt.executeBatch();con.commit();con.commit();

Page 73: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Transacciones con Transacciones con B.B.D.D.B.B.D.D. El método executeBatch() devuelve El método executeBatch() devuelve

un array de cuentas actualizadas, un array de cuentas actualizadas, una por operación del lote.una por operación del lote.

Las operaciones por lotes pueden Las operaciones por lotes pueden lanzar una excepción lanzar una excepción BatchUpdateExceptionBatchUpdateException Necesitamos añadir un manejador de Necesitamos añadir un manejador de

excepcionesexcepciones

Page 74: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Puntos de guardadoPuntos de guardado

El API JDBC 3.0 incluye la capacidad de El API JDBC 3.0 incluye la capacidad de emplear puntos de salvaguardia o emplear puntos de salvaguardia o savepoints.savepoints.

Un savepoint es un marcador, dentro de Un savepoint es un marcador, dentro de una serie de operaciones de una una serie de operaciones de una transaccióntransacción Nos permite hacer commit parcialesNos permite hacer commit parciales Nos permite hacer rollback parcialesNos permite hacer rollback parciales

No todos los drivers JDBC soportan su uso, No todos los drivers JDBC soportan su uso, por lo que tendremos que comprobarlo por lo que tendremos que comprobarlo antes de usarlos.antes de usarlos.

Page 75: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Puntos de guardadoPuntos de guardado

Ejemplo de usoEjemplo de usoconexion.setAutoCommit(conexion.setAutoCommit(falsefalse););// Ejecución de un grupo de operaciones// Ejecución de un grupo de operacionesSavePoint primero;SavePoint primero;

primero=conexion.setSavePoint("nombre");primero=conexion.setSavePoint("nombre");// Segundo grupo de operaciones// Segundo grupo de operaciones// Si queremos deshacer este segundo // Si queremos deshacer este segundo

grupogrupoconexion.rollback(primero);conexion.rollback(primero);// Si queremos ejecutarlas// Si queremos ejecutarlasconexion.releaseSavepoint(primero);conexion.releaseSavepoint(primero);// Mas operaciones// Mas operaciones

Page 76: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Sentencias preparadasSentencias preparadas

Se utilizan cuando realizamos la Se utilizan cuando realizamos la misma operación varias vecesmisma operación varias veces

La consulta será precompilada por el La consulta será precompilada por el motor SQL de la B.B.D.D. que motor SQL de la B.B.D.D. que utilicemosutilicemos

Proporciona una forma más cómoda Proporciona una forma más cómoda de ejecutar consultas a las cuales de ejecutar consultas a las cuales hay que pasar muchos parámetros.hay que pasar muchos parámetros.

Page 77: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Sentencias preparadasSentencias preparadas

Modo de usoModo de uso Los signos de interrogación representan Los signos de interrogación representan

los parámetroslos parámetros Para sustituir cada signo de Para sustituir cada signo de

interrogación se utiliza el método interrogación se utiliza el método setXXXX(pos,valor), cuyo nombre setXXXX(pos,valor), cuyo nombre depende del tipo del parámetro.depende del tipo del parámetro. ““pos” indica la posición del interrogante pos” indica la posición del interrogante

que sustituimos, comenzando en 1que sustituimos, comenzando en 1

Page 78: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Sentencias preparadasSentencias preparadas

//Método para insertar un registro en la tabla Propietarios. Los //argumentos del método son el DNI, nombre y edad.

public void insertar(String dni, String n, int ed) {

PreparedStatement ps = con.prepareStatement("insert into Propietarios values (?,?,?) ");

ps.setString(1, dni); ps.setString(2, n);ps.setInt(3, ed);

//En este caso, el método executeUpdate devuelve la cantidad de //elementos insertados.

if (ps.executeUpdate()!=1){

throw new Exception("Error en la Inserción");}

}

Page 79: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Usar la API JDBC nos facilita la Usar la API JDBC nos facilita la programación independiente de la programación independiente de la B.B.D.D.B.B.D.D. Podemos migrar nuestra aplicación a Podemos migrar nuestra aplicación a

otra B.B.D.D. con relativa facilidadotra B.B.D.D. con relativa facilidad Dos items todavía son específicos de Dos items todavía son específicos de

la B.B.D.D. en particularla B.B.D.D. en particular DriverDriver URL JDBCURL JDBC

Page 80: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

La API JDBC 2.0 proporciona las fuentes La API JDBC 2.0 proporciona las fuentes de datos, que nos proporcionan aún mayor de datos, que nos proporcionan aún mayor independencia con respecto a la B.B.D.D.independencia con respecto a la B.B.D.D.

Un objeto DataSource representa una Un objeto DataSource representa una fuente de datos particular en una fuente de datos particular en una aplicación Java.aplicación Java.

Encapsula la información específica de la Encapsula la información específica de la B.B.D.D. y del driver JDBCB.B.D.D. y del driver JDBC

Proporciona métodos para seleccionar y Proporciona métodos para seleccionar y obtener las propiedades requeridas por obtener las propiedades requeridas por DataSource.DataSource.

Page 81: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Propiedades estándar requeridas por Propiedades estándar requeridas por DataSourceDataSource databaseNamedatabaseName serverNameserverName portNumberportNumber userNameuserName passwordpassword

Un beneficio añadido es que toda la Un beneficio añadido es que toda la información “sensible” se almacena en un información “sensible” se almacena en un único lugar.único lugar.

DataSource utiliza Java Naming and DataSource utiliza Java Naming and Directory Interface (JNDI)Directory Interface (JNDI)

Page 82: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Registrar una fuente de datosRegistrar una fuente de datosprivate String serverName = "persistentjava.com"; private String serverName = "persistentjava.com"; private int portNumber = 1433; private int portNumber = 1433; private String login = "java"; private String login = "java"; private String password = "sun"; private String password = "sun"; private String databaseName = "jdbc"; private String databaseName = "jdbc"; // Nombre que asignamos a nuestra fuente de datos.// Nombre que asignamos a nuestra fuente de datos.// Dado que estamos utilizando el proveedor del // Dado que estamos utilizando el proveedor del

sistemasistema// de archivos, nuestro nombre sigue las reglas de// de archivos, nuestro nombre sigue las reglas de// nombrado de dicho sistema. El subcontexto // nombrado de dicho sistema. El subcontexto

reservadoçreservadoç// JNDI para aplicaciones JDBC es jdbc, por lo que// JNDI para aplicaciones JDBC es jdbc, por lo que// nuestro nombre comienza equivalentementeprivate // nuestro nombre comienza equivalentementeprivate

String filePath = "jdbc/pjtutorial"; String filePath = "jdbc/pjtutorial";

Page 83: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

public InicializarJNDI() public InicializarJNDI() { {

// Para utilizar los parámetros, necesitamos crear // Para utilizar los parámetros, necesitamos crear y poblary poblar

// un Hashtable.// un Hashtable.Hashtable env = new Hashtable(); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); "com.sun.jndi.fscontext.RefFSContextFactory"); // Creamos el contexto inicial// Creamos el contexto inicialContext ctx = new InitialContext(env); Context ctx = new InitialContext(env); // Aquí creamos el DataSource y asignamos los // Aquí creamos el DataSource y asignamos los

parámetrosparámetros// relevantes// relevantesClientDataSource ds = new ClientDataSource(); ClientDataSource ds = new ClientDataSource();

Page 84: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

ds.setServerName(serverName); ds.setServerName(serverName); ds.setPortNumber(portNumber); ds.setPortNumber(portNumber); ds.setDatabaseName(databaseName); ds.setDatabaseName(databaseName); ds.setUser(login); ds.setUser(login); ds.setPassword(password); ds.setPassword(password); ds.setDescription("JDBC DataSource ds.setDescription("JDBC DataSource

Connection"); Connection"); // Ahora enlazamos el objeto DataSource al // Ahora enlazamos el objeto DataSource al

nombrenombre// que hemos seleccionado anteriormente// que hemos seleccionado anteriormentectx.bind(filePath, ds); ctx.bind(filePath, ds); ctx.close(); ctx.close();

}}

Page 85: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Usar una fuente de datosUsar una fuente de datospublic UtilizarJNDI()public UtilizarJNDI(){ {

// Necesitamos montar el contexto JNDI para poder// Necesitamos montar el contexto JNDI para poder// interactuar con el proveedor de servicio correcto, // interactuar con el proveedor de servicio correcto,

enen// este caso, el sistema de ficheros.// este caso, el sistema de ficheros.Hashtable env = new Hashtable() ; Hashtable env = new Hashtable() ; env.put(Context.INITIAL_CONTEXT_FACTORY, env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory") ; "com.sun.jndi.fscontext.RefFSContextFactory") ; Context ctx = new InitialContext(env) ; Context ctx = new InitialContext(env) ; // Dado el contecto JNDI, buscamos nuestro // Dado el contecto JNDI, buscamos nuestro

DataSourceDataSourceDataSource ds = DataSource ds =

(DataSource)ctx.lookup("jdbc/pjtutorial"); (DataSource)ctx.lookup("jdbc/pjtutorial");

Page 86: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

// Ahora obtenemos una conexión con la // Ahora obtenemos una conexión con la B.B.D.D. yB.B.D.D. y

// procedemos a realizar nuestro trabajo// procedemos a realizar nuestro trabajoConnection con = ds.getConnection() ; Connection con = ds.getConnection() ; System.out.println("Connection System.out.println("Connection

Established.") ; Established.") ; con.close(); con.close();

} }

Page 87: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Redefinir una fuente de datosRedefinir una fuente de datos

// Definimos los parámetros para esta fuente de datos// Definimos los parámetros para esta fuente de datosprivate String serverName = "persistentjava.com"; private String serverName = "persistentjava.com"; private int portNumber = 1434; // Nuevo puertoprivate int portNumber = 1434; // Nuevo puertoprivate String login = "sun"; // Nuevos datos de accesoprivate String login = "sun"; // Nuevos datos de accesoprivate String password = "java"; private String password = "java"; private String databaseName = "ds"; // Nueva private String databaseName = "ds"; // Nueva

B.B.D.D.B.B.D.D.// Mantenemos el mismo nombre para nuestra fuente // Mantenemos el mismo nombre para nuestra fuente

dede// datos, simplemente lo asociamos a un nuevo // datos, simplemente lo asociamos a un nuevo

DataSourceDataSourceprivate String filePath = "jdbc/pjtutorial"; private String filePath = "jdbc/pjtutorial";

Page 88: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

public RedefinirJNDI() public RedefinirJNDI() { {

// Establecemos el contexto JNDI adecuado // Establecemos el contexto JNDI adecuado Hashtable env = new Hashtable(); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); "com.sun.jndi.fscontext.RefFSContextFactory"); // Creamos el contexto // Creamos el contexto Context ctx = new InitialContext(env); Context ctx = new InitialContext(env); ClientDataSource ds = new ClientDataSource(); ClientDataSource ds = new ClientDataSource(); ds.setServerName(serverName); ds.setServerName(serverName); ds.setPortNumber(portNumber); ds.setPortNumber(portNumber); ds.setDatabaseName(databaseName); ds.setDatabaseName(databaseName);

Page 89: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

ds.setUser(login); ds.setUser(login); ds.setPassword(password); ds.setPassword(password); ds.setDescription(“Conexión a una fuente de ds.setDescription(“Conexión a una fuente de

datos, bis"); datos, bis"); // Ahora simplemente llamamos el método // Ahora simplemente llamamos el método

rebind() con rebind() con // el nuevo Datasource.// el nuevo Datasource.ctx.rebind(filePath, ds); ctx.rebind(filePath, ds); ctx.close(); ctx.close();

} }

Page 90: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Fuentes de datosFuentes de datos

Borrar una fuente de datosBorrar una fuente de datos

public DeleteJNDI() { public DeleteJNDI() { Hashtable env = new Hashtable(); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); "com.sun.jndi.fscontext.RefFSContextFactory"); Context ctx = new InitialContext(env); Context ctx = new InitialContext(env); // Desligar la asociación de nombre del objeto // Desligar la asociación de nombre del objeto

borraborra// automáticamente el objeto// automáticamente el objetoctx.unbind("jdbc/pjtutorial") ; ctx.unbind("jdbc/pjtutorial") ; ctx.close() ; ctx.close() ;

} }

Page 91: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

¿Por qué necesitamos almacenes de ¿Por qué necesitamos almacenes de conexiones?conexiones? Con DriverManager o DataSource, cada solicitud Con DriverManager o DataSource, cada solicitud

de conexión implica una sobrecarga importantede conexión implica una sobrecarga importante Impacto en el rendimiento con muchas conexionesImpacto en el rendimiento con muchas conexiones

Proceso de conexión típica con una Proceso de conexión típica con una B.B.D.D.:B.B.D.D.: La aplicación Java llama a getConnection()La aplicación Java llama a getConnection() El Driver o DataSource solicita una conexión El Driver o DataSource solicita una conexión

socket desde la JVMsocket desde la JVM La JVM comprueba los aspectos de seguridadLa JVM comprueba los aspectos de seguridad

Page 92: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

Si se aprueba, la llamada pasa a través del Si se aprueba, la llamada pasa a través del interfaz de red del host hasta la LAN interfaz de red del host hasta la LAN corporativacorporativa

Normalmente, la llamada pasa a través de un Normalmente, la llamada pasa a través de un cortafuegos para alcanzar la WAN o Internetcortafuegos para alcanzar la WAN o Internet

La llamada alcanza su red de destino La llamada alcanza su red de destino (cortafuegos)(cortafuegos)

La llamada alcanza el host de la B.B.D.D.La llamada alcanza el host de la B.B.D.D. El servidor de B.B.D.D. procesa la solicitudEl servidor de B.B.D.D. procesa la solicitud La B.B.D.D. inicializa una nueva conexión La B.B.D.D. inicializa una nueva conexión

clientecliente Sobrecarga de memoria y carga del procesadorSobrecarga de memoria y carga del procesador

Page 93: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

La llamada de retorno es enviada de vuelta al La llamada de retorno es enviada de vuelta al cliente JDBC (incluyendo pasos por routers y cliente JDBC (incluyendo pasos por routers y cortafuegos)cortafuegos)

La JVM recibe el retorno y crea un ConnectionLa JVM recibe el retorno y crea un Connection La aplicación Java recibe el objeto ConnectionLa aplicación Java recibe el objeto Connection

Solicitar un nuevo Connection causa una Solicitar un nuevo Connection causa una gran carga y tiene muchos puntos de fallo gran carga y tiene muchos puntos de fallo posiblesposibles ¿Por qué no reutilizar conexiones a B.B.D.D.?¿Por qué no reutilizar conexiones a B.B.D.D.? JDBC tiene el objeto JDBC tiene el objeto

ConnectionPoolDataSourceConnectionPoolDataSource Almacena y reutiliza las conexiones, no las eliminaAlmacena y reutiliza las conexiones, no las elimina

Page 94: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

¿Qué es una PooledConnection?¿Qué es una PooledConnection? Tipo especial de conexión que no se borra Tipo especial de conexión que no se borra

cuando se cierra, al contrario que los cuando se cierra, al contrario que los Connection normalesConnection normales

Una PooledConnection es almacenada para una Una PooledConnection es almacenada para una reutilización posteriorreutilización posterior Potencialmente, una gran mejora de rendimientoPotencialmente, una gran mejora de rendimiento

Trabajar con un almacen de conexiones es casi Trabajar con un almacen de conexiones es casi idéntico a trabajar con objetos DataSourceidéntico a trabajar con objetos DataSource

En vez de utilizar un objeto DataSource, En vez de utilizar un objeto DataSource, utilizamos un ConnectionPoolDataSource utilizamos un ConnectionPoolDataSource (utilizando JDNI)(utilizando JDNI)

Page 95: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

Cómo utilizar un objeto de fuente de Cómo utilizar un objeto de fuente de datos almacenada:datos almacenada: Llamamos a getPooledConnection() Llamamos a getPooledConnection()

sobre el ConnectionPooledDataSourcesobre el ConnectionPooledDataSource Creamos un objeto Connection con Creamos un objeto Connection con

getConnection sobre el objeto getConnection sobre el objeto PooledConnectionPooledConnection El objeto ConnectionPoolDataSource se El objeto ConnectionPoolDataSource se

encarga de gestionar las diferentes encarga de gestionar las diferentes conexionesconexiones

Page 96: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

public class InicializarJNDI { public class InicializarJNDI { private String servidor = "localhost" ; private String servidor = "localhost" ; private String baseDeDatos = "jdbc" ; private String baseDeDatos = "jdbc" ; private String usuario = "java" ; private String usuario = "java" ; private String contraseña= "sun" ; private String contraseña= "sun" ; // El subcontexto apropiado de JNDI para un // El subcontexto apropiado de JNDI para un

PooledDataSource es jdbcpool PooledDataSource es jdbcpool private String direccion = "jdbcPool/pjtutorial" ; private String direccion = "jdbcPool/pjtutorial" ; private int puerto = 1114 ; private int puerto = 1114 ; private int tamañoPool= 10 ; // Queremos crear private int tamañoPool= 10 ; // Queremos crear

un almacén con 10 conexionesun almacén con 10 conexiones

Page 97: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

public InicializarJNDI() public InicializarJNDI()

{ {

Hashtable entorno = new Hashtable(); Hashtable entorno = new Hashtable();

entorno .put(Context.INITIAL_CONTEXT_FACTORY, entorno .put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory"); "com.sun.jndi.fscontext.RefFSContextFactory");

Context contexto = new InitialContext(entorno ); Context contexto = new InitialContext(entorno );

// Creamos el PooledDataSource y asignamos los // Creamos el PooledDataSource y asignamos los parámetros parámetros

ClientConnectionPoolDataSource ds;ClientConnectionPoolDataSource ds;

ds = new ClientConnectionPoolDataSource() ; ds = new ClientConnectionPoolDataSource() ;

Page 98: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

ds.setServerName(serverName) ; ds.setServerName(serverName) ; ds.setPort(portNumber) ; ds.setPort(portNumber) ; ds.setDatabaseName(databaseName) ; ds.setDatabaseName(databaseName) ; ds.setUser(userName) ; ds.setUser(userName) ; ds.setPassword(password) ; ds.setPassword(password) ; ds.setMaxPoolSize(poolSize) ; ds.setMaxPoolSize(poolSize) ; // Enlazamos el objeto DataSource con su // Enlazamos el objeto DataSource con su

nombre nombre contexto.bind(direccion, ds) ; contexto.bind(direccion, ds) ; contexto.close() ; contexto.close() ; } } }}

Page 99: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

Uso de un almacén de conexiones:Uso de un almacén de conexiones:

public UtilizeJNDI(){ public UtilizeJNDI(){ Hashtable entorno = new Hashtable() ; Hashtable entorno = new Hashtable() ; entorno.put(Context.INITIAL_CONTEXT_FACTORY, entorno.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory") ; "com.sun.jndi.fscontext.RefFSContextFactory") ; Context contexto = new InitialContext(entorno) ; Context contexto = new InitialContext(entorno) ; // Buscamos el DataSource a través del contexto por // Buscamos el DataSource a través del contexto por

su nombresu nombre ConnectionPoolDataSource ds;ConnectionPoolDataSource ds; ds= (ConnectionPoolDataSource) ds= (ConnectionPoolDataSource)

contexto.lookup("jdbcPool/pjtutorial") ; contexto.lookup("jdbcPool/pjtutorial") ;

Page 100: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Almacenes de conexionesAlmacenes de conexiones

// Un PooledConnection proporciona un // Un PooledConnection proporciona un Connection especialConnection especial

// que no se destruye cuando se cierra, sino que // que no se destruye cuando se cierra, sino que vuelve alvuelve al

// // almacén dealmacén de conexiones conexiones

PooledConnection pcon = PooledConnection pcon = ds.getPooledConnection() ; ds.getPooledConnection() ;

Connection con = pcon.getConnection() ; Connection con = pcon.getConnection() ;

System.out.println("Connection Established") ; System.out.println("Connection Established") ;

con.close(); con.close();

} }

Page 101: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Optimizar las Optimizar las comunicacionescomunicaciones LogWriterLogWriter

Flujo de salida de tipo carácterFlujo de salida de tipo carácter Puede ser designado desde:Puede ser designado desde:

DriverDriver DataSourceDataSource ConnectionPooledDataSourceConnectionPooledDataSource

Establecido mediante setLogWriter()Establecido mediante setLogWriter() Podemos obtenerlo mediante Podemos obtenerlo mediante

getLogWriter()getLogWriter() Nos ayuda a detectar bugs y seguir el flujo Nos ayuda a detectar bugs y seguir el flujo

de la aplicación.de la aplicación.

Page 102: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Optimizar las Optimizar las comunicacionescomunicaciones DriverPropertyInfoDriverPropertyInfo

Encapsula toda la información de Encapsula toda la información de propiedades que necesita un driver para propiedades que necesita un driver para establecer una conexión a una B.B.D.D.establecer una conexión a una B.B.D.D.

Objetos Connection y Objetos Connection y PooledConnectionPooledConnection Se pueden configurar para ser de sólo Se pueden configurar para ser de sólo

lectura mediante el método setReadOnly()lectura mediante el método setReadOnly() Tiene que ser soportado tanto por el driver Tiene que ser soportado tanto por el driver

como por la B.B.D.D. subyacentecomo por la B.B.D.D. subyacente Permite optimizar el rendimiento del sistemaPermite optimizar el rendimiento del sistema

Page 103: JDBC Acceso a B.B.D.D. con Java Arquitectura de la aplicación Elegir la arquitectura de la aplicación Elegir la arquitectura de la aplicación Es uno.

Optimizar las Optimizar las comunicacionescomunicaciones setAutoCommit()setAutoCommit() nativeSQL()nativeSQL() setTransactionIsolation()setTransactionIsolation()

Debemos analizar la necesidades que Debemos analizar la necesidades que tenemos y seleccionar el nivel de tenemos y seleccionar el nivel de aislamiento procedenteaislamiento procedente TRANSACTION_NONETRANSACTION_NONE TRANSACTION_READ_UNCOMMITEDTRANSACTION_READ_UNCOMMITED TRANSACTION_READ_COMMITEDTRANSACTION_READ_COMMITED TRANSACTION_REPEATABLE_READTRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLETRANSACTION_SERIALIZABLE