La principal API del soporte de origen de datos del proxy es WSProxyDataSourceHelper. A continuación se muestra la interfaz de WSProxyDataSourceHelper:
package com.ibm.websphere.proxyds; /** * La interfaz de WSDataSourceHelper es aquélla que se utiliza para el soporte * de varios orígenes de datos CMP (también se llama origen de datos del proxy). * Los usuarios pueden buscar instancias de WSProxyDataSourceHelper en el espacio * de nombres JNDI con el nombre JNDI WSProxyDataSourceHelper.JNDI_NAME. * * Se utiliza esta interfaz para dar soporte al modelo de origen de datos del proxy. La * interfaz WSDataSourceHelper que admite el modelo V5 Proxy DataSource * se desecha. Se recomienda encarecidamente a los usuarios que utilicen esta interfaz para * aprovechar las ventajas del modelo de origen de datos del proxy. * * Hay dos métodos helper (de ayuda) en esta interfaz. * * resolveDataSourceReference(String): * Este método helper se utiliza para resolver el nombre JNDI global del origen * de datos asociado con una referencia de recursos. Por ejemplo, si se correlaciona * una referencia de recursos "jdbc/myDS1" con un origen de datos con un nombre JNDI * global "jdbc/Bank1", la llamada al método resolveDataSourceReference("jdbc/myDS1") * resolveDataSourceReference("jdbc/myDS1") devolverá "jdbc/Bank1". * * * setCurrentDataSourceJndiName(String, String): * Este método permite establecer el nombre JNDI (no el nombre de la referencia de recurso) del * origen de datos de delegación de un origen de datos del proxy concreto al que accederá la transacción * actual. El nombre JNDI del origen de datos se puede adquirir utilizando el * método resolveDataSourceReference(String). * * * A continuación figura un ejemplo: * * Una aplicación tiene un EJB CMP "Account". Los datos de Account se distribuyen entre * dos servidores de base de datos DB2 distintos, uno en la costa oeste y el otro * en la costa este. Para que el EJB CMP Account pueda acceder a las dos bases de datos, * se utiliza el modelo de origen de datos del proxy. * * El EJB CMP Account se configura con la fábrica de conexiones CMP "jdbc/ProxyDS". * El bean de sesión AccountTransaction, que sirve de * fachada de sesión para el EJB CMP Account, se configura con tres * referencias de recurso: "jdbc/myDS1", "jdbc/myDS2" y "jdbc/proxy". * * En el espacio de administración, el administrador crea dos orígenes de datos DB2: * "jdbc/Account1" y "jdbc/Account2", uno para la base de datos de la costa oeste y el * otro para la base de datos de la costa este. El administrador también crea un * origen de datos del proxy "jdbc/Accountroxy". * Los jndiNames de propiedad personalizada de este origen de datos del proxy se establecen en * "jdbc/Account1;jdbc/Account2" * * Durante el despliegue, las referencias de origen de datos "jdbc/myDS1" y "jdbc/myDS2" * se correlacionan con los orígenes de datos físicos "jdbc/Account1" y "jdbc/Acocunt2". * La referencia de origen de datos "jdbc/proxy" se correlaciona * con el origen de datos del proxy físico "jdbc/AccountProxy". La fábrica de conexiones CMP * "jdbc/ProxyDS" también se correlaciona con el mismo origen de datos del proxy físico "jdbc/AccountProxy". * * Durante el desarrollo, la aplicación no detecta con qué orígenes * de datos físicos se correlacionan estas referencias de * recurso. Para obtener el nombre JNDI de los orígenes de datos físicos, la * aplicación puede resolver los orígenes de datos del método setSessionContext * utilizando este código: * * // Buscar WSProxyDataSourceHelper * dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); * ... * ds1JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS1"); * ds2JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS2"); * proxyJndiName = dsHelper.resolveDataSourceReference("jdbc/proxy"); * * * Antes de llamar a los EJB CMP, el bean de sesión puede utilizar * el método setCurrentDataSourceJndiName(String, String) para indicar qué * origen de datos de delegación utilizará este EJB CMP. En nuestro ejemplo, si el código de cuenta (accountId) * comienza con "W", lo que significa que los datos residen en la base de datos de la costa oeste, * se utilizará el primer origen de datos de delegación. Por ejemplo: * public String createAccount(String accountId, float balance) { // Establecer el origen de datos al que accederá esta transacción. // Si el código de cuenta comienza por "W", el CMP accederá al primer origen de datos; // De lo contrario, se utilizará el segundo origen de datos. if (accountId.startsWith("W")) { dsHelper.setCurrentDataSourceJndiName(proxyJndiName, ds1JndiName); } else { dsHelper.setCurrentDataSourceJndiName(proxyJndiName, ds2JndiName); } AccountLocal account = null; try { account = accountHome.create(accountId); account.setCreationDate(new Timestamp(System.currentTimeMillis())); account.setOpenBalance(balance); account.setBalance(balance); } catch (CreateException ce) { throw new EJBException(ce); } ...... * * * * @ibm-api */ public interface WSProxyDataSourceHelper { /** El nombre JNDI para que el usuario busque una instancia de WSProxyDataSourceHelper */ String JNDI_NAME = "java:comp/env/com/ibm/websphere/proxyds/WSProxyDataSourceHelper"; /** * Resuelva la referencia del origen de datos en el nombre JNDI global. Por * ejemplo, si se correlaciona una referencia de recursos "jdbc/myDS1" con un * origen de datos con un nombre JNDI global "jdbc/Bank1", * resolveDataSourceReference("jdbc/myDS1") devolverá "jdbc/Bank1". * * @param dsResRefName nombre de la referencia de recursos * @return nombre JNDI global del origen de datos resuelto de esta referencia. * @exception ResRefNotFoundException indica que el nombre de la referencia de * recursos no se puede encontrar */ String resolveDataSourceReference(String dsResRefName) throws ResRefNotFoundException; /** * Establezca el nombre JNDI (no el nombre de referencia de recurso) del origen * de datos de delegación al que accederá la transacción actual. Actualmente, una * transacción puede acceder a varios orígenes de datos del proxy. No obstante, para * un origen de datos del proxy concreto, sólo se puede acceder a un origen de datos de delegación. * * Por ejemplo, hay dos orígenes de datos del proxy con el nombre JNDI "jdbc/proxy1" * y "jdbc/proxy2". Los orígenes de datos de delegación para el origen de datos del proxy "jdbc/proxy1" son "jdbc/ds1" y "jdbc/ds2". Los orígenes de datos de delegación para el * origen de datos del proxy "jdbc/proxy2" son "jdbc/ds3" y "jdbc/ds4". En una transacción, puede acceder a "jdbc/proxy1" y "jdbc/proxy2". No obstante, no puede acceder * a los dos orígenes de datos de delegación "jdbc/ds1" y "jdbc/ds2" para el origen de datos del proxy * "jdbc/proxy1". Tampoco puede acceder a los dos orígenes de datos de delegación "jdbc/ds3" * y "jdbc/ds4" para el origen de datos del proxy "jdbc/proxy2". * * Durante el desarrollo, los desarrolladores no pueden saber el nombre JNDI * global del origen de datos con el que se correlacionará una referencia de * recurso. El único hecho conocido es el nombre de referencia del recurso. * El procedimiento recomendado es llamar al método resolveDataSourceReference(String) * para obtener el nombre JNDI del origen de datos correlacionado y luego llamar a * setCurrentDataSourceJndiName(String, String) con el nombre JNDI global. * * @param proxyJndiName el nombre JNDI del origen de datos del proxy * @param dsJndiName el nombre JNDI del origen de datos de delegación actual */ void setCurrentDataSourceJndiName(String proxyJndiName, String dsJndiName); }
Related concepts
Programación de Partitioning Facility