Las aplicaciones que acceden a BD necesitan, como primer paso para poder gestionar los datos de la BD, establecer la conexión con la BD a gestionar. La API XQJ facilita dos interfaces apropiadas para lograr este objetivo:
-
XQDataSource, Fábrica para obtener objetos XQConnection
-
XQConnection, Para referenciar conexiones (sesiones) con un SGBD específico. Toda conexión se logra, forzosamente, a través de un objeto XQDataSource
Así, para obtener una conexión, hay que seguir el siguiente esquema:
XQDataSource xqs = new ExistXQDataSource();
XQConnection con = xqs. getConnection ( lista_parametros ) ;
Una vez se dispone del objeto XQDataSource ya estamos en condiciones de crear un objeto XQConnection para establecer la sesión de trabajo con el SGBD y eso lo conseguimos con el método getConnection() de la interfaz XQDataSource.
La API XQJ facilita sobrecargas del método getConnection():
La interfaz setProperty()
nos permite definir una serie de propiedades antes de intentar establecer la conexión con el método getConnection()
:
void setProperty ( String name, String value ) throws XQException;
Entre las propiedades que permite establecer el método setProperty()
encontramos el nombre de la máquina, el puerto, el nombre de la base de datos, el usuario y la contraseña.
El método XQDataSource.getConnection() devuelve, si todo es correcto, un objeto que implementa la interfaz XQConnection, el cual utilizaremos para ejecutar cualquier acción XQuery o Update sobre la BD. Al finalizar el programa hay que recordar siempre de cerrar la conexión con el método XQConnection.close(), a fin de liberar todos los recursos asignados por el sistema operativo para mantener la conexión.
La interfaz XQConnection facilita métodos para crear expresiones sobre las que ejecutaremos sentencias XQuery / Update, y los métodos para validar ( commit()) o deshacer ( rollback()) los cambios llevados a cabo durante una transacción.
Ejemplo de conexion :
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQSequence;
import net.xqj.exist.ExistXQDataSource;
public class HelloWorld {
public static void main(String[] args) throws XQException {
XQDataSource ds = new ExistXQDataSource();
ds.setProperty("serverName", "localhost");
ds.setProperty("port", "8083");
XQConnection con = ds.getConnection();
String query = "<hello-world>{1 + 1}</hello-world>";
XQPreparedExpression expr = con.prepareExpression(query);
XQSequence result = expr.executeQuery();
// prints "<hello-world>2</hello-world>"
System.out.println(result.getSequenceAsString(null));
result.close();
expr.close();
con.close();
}
}
En eXist-db, el hecho de que el método XQDataSource.getConnection() no levante una excepción, no es garantía de que la conexión se haya establecido correctamente.
En el ejemplo anterior la conexion se hace con un usuario guest que es la opción por defecto si no se especifica usuario y contraseña. Para conectarse con un usuario se utilizan el método setProperty():
ds.setProperty("user" , "admin");
ds.setProperty("password" , "admin");
Por defecto, una conexión opera en modo auto-commit
, lo que significa que cada instrucción Update es ejecutada y validada en una transacción individual, Esta forma de trabajar se puede desactivar con el método XQConnection.setAutoCommit()
, y en tal situación, la transacción finalizará efectuando una llamada al método commit()
o rollback()
, dando lugar al inicio de una nueva transacción. No hay, pues, una instrucción específica para indicar el inicio de transacción.