Datanucleus (JDO) – Configurar multiples conexiones (PersistenceManagerFactory)

septiembre 5, 2012

En una aplicación con múltiples módulos, es probable que diferentes módulos accedan a distintas bases de datos o esquemas y con distintas credenciales.

Para configurar multiples conexiones en Datanucleus hay que crear un archivo jdoconfig.xml en la carpeta META-INF del classpath (WEB-INF/classes/META-INF en una aplicación web). Si utilizas Maven crea el archivo en la carpeta src/main/resources/META-INF y Maven copiara el archivo y la carpeta al classpath.


<?xml version="1.0" encoding="UTF-8"?>

<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

<persistence-manager-factory name="compras">

<property name="javax.jdo.PersistenceManagerFactoryClass"

value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>

<property name="javax.jdo.option.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>

<property name="javax.jdo.option.ConnectionURL" value="jdbc:oracle:thin:@132.147.0.1:1521:dbcompras"/>

<property name="javax.jdo.option.ConnectionUserName" value="usrcompras"/>

<property name="javax.jdo.option.ConnectionPassword" value="secret"/>

<property name="javax.jdo.option.DetachAllOnCommit" value="true"/>

</persistence-manager-factory>

<persistence-manager-factory name="recursoshumanos">

<property name="javax.jdo.PersistenceManagerFactoryClass"

value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>

<property name="javax.jdo.option.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>

<property name="javax.jdo.option.ConnectionURL" value="jdbc:oracle:thin:@192.168.0.250:1521:dbrh"/>

<property name="javax.jdo.option.ConnectionUserName" value="usrrh"/>

<property name="javax.jdo.option.ConnectionPassword" value="topsecret"/>

<property name="javax.jdo.option.DetachAllOnCommit" value="true"/>

</persistence-manager-factory>

</jdoconfig>

Para obtener una instancia PersistenceManagerFactory podríamos tener una clase PMF en cada módulo (suponiendo que son proyectos distintos) como la siguiente. Cambiando solamente el nombre de acuerdo al PersistenceManagerFactory que vamos a utilizar. También podrías recibir como parámetro el nombre del PersistenceManagerFactory y almacenarlo en un Map para usos posteriores, esto si los módulos se encuentran en el mismo proyecto.


public class PMF {

private static final PersistenceManagerFactory instance=JDOHelper.getPersistenceManagerFactory("compras");

private PMF() {

}

public static PersistenceManagerFactory get(){

return instance;

}

}

Y lo usarías de la siguiente forma


public static List<Compra> getCompras(){

List<Compra> compras;

PersistenceManager pm = PMF.get().getPersistenceManager();

Transaction tx = pm.currentTransaction();

try{

tx.begin();

Query query = pm.newQuery(Compra.class);

jueces=(List<Compra>) query.execute();

tx.commit();

}finally{

if(tx.isActive()){

tx.rollback();

}

pm.close();

}

return compras;

}

Fuentes:

http://www.datanucleus.org/products/datanucleus/jdo/pmf_named.html
http://stackoverflow.com/questions/1297473/maven-including-a-meta-inf-folder-in-the-classes-folder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: