L'API principale du support de source de données proxy est WSProxyDataSourceHelper. L'interface WSProxyDataSourceHelper est présentée ci-dessous :
package com.ibm.websphere.proxyds; /** * * L'interface WSDataSourceHelper est une interface utilisée pour le support de * sources de données multiples (également appelées sources de données proxy). Vous * pouvez rechercher une instance de WSProxyDataSourceHelper à partir de l'espace de nom de * WSProxyDataSourceHelper.JNDI_NAME. * * Cette interface permet de prendre en charge le modèle Source de données proxy. L'interface * WSDataSourceHelper qui prend en charge le modèle Source de données * proxy version 5 est obsolète. Il est fortement recommandé d'utiliser cette interface * pour tirer parti des avantages offerts par le modèle Source de données proxy. * * Cette interface comporte deux méthodes auxiliaires. * * resolveDataSourceReference(String) : * Cette méthode auxiliaire permet de résoudre le nom JNDI global de la source de données * associée à une référence de ressource. Par exemple, si une référence de ressource * "jdbc/myDS1" est mappée à une source de données avec le nom JNDI global * "jdbc/Bank1", l'appel de méthode resolveDataSourceReference("jdbc/myDS1") * renvoie "jdbc/Bank1". * * * setCurrentDataSourceJndiName(String, String) : * Cette méthode permet de définir le nom JNDI (pas le nom de la référence de ressource) de * la source de données déléguée d'une source de données proxy à laquelle la transaction * en cours doit accéder. Le nom JNDI de la source de données peut être obtenu à l'aide de la * méthode resolveDataSourceReference(String). * * * Voici un exemple : * * Une application possède un EJB CMP "Account". Les données "Account" * sont réparties sur deux serveurs de base de données DB2 différents, * l'un sur la côte est, l'autre sur la côte ouest. Pour que l'EJB CMP * puisse accéder aux deux bases de données, le modèle Source de données * proxy est utilisé. * * L'EJB CMP "Account" est configuré avec une fabrique de connexions CMP "jdbc/ProxyDS". * Le bean session "AccountTransaction", qui assure la fonction de bean façade * pour l'EJB CMP "Account", est configuré avec trois références de ressources * "jdbc/myDS1", "jdbc/myDS2" et "jdbc/proxy". * * Dans l'espace d'administration, l'administrateur crée deux sources de données DB2 * "jdbc/Account1" et "jdbc/Account2", une pour la base de données de la côte ouest et * l'autre pour la base de données de la côte est. L'administrateur crée également une * source de données proxy "jdbc/Accountroxy". * La propriété personnalisée jndiNames de cette source de données proxy correspond à * "jdbc/Account1;jdbc/Account2" * * Pendant la phase de déploiement, les références des sources de données "jdbc/myDS1" et "jdbc/myDS2" * sont mappées à des sources de données physiques "jdbc/Account1" et "jdbc/Account2". * La référence de source de données "jdbc/proxy" est mappée à la source de données proxy * physique "jdbc/AccountProxy". La fabrique de connexions CMP "jdbc/ProxyDS" est également * mappée à la même source de données proxy physique "jdbc/AccountProxy". * * Lors de la phase de développement, l'application ne sait pas à quelles * sources de données physiques ces références de ressources sont mappées. * Pour obtenir le nom JNDI des sources de données physiques, l'application * peut résoudre les source de données dans la méthode setSessionContext en * utilisant le code suivant : * * // Recherche de WSProxyDataSourceHelper * dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); * ... * ds1JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS1"); * ds2JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS2"); * proxyJndiName = dsHelper.resolveDataSourceReference("jdbc/proxy"); * * * Avant que le bean session n'appelle les EJB CMP, le bean session bean peut utiliser * la méthode setCurrentDataSourceJndiName(String, String) pour indiquer la source de * données déléguée que cet EJB CMP doit utiliser. Dans notre exemple, si l'ID du * compte commence par "W", c'est-à-dire que les données se trouvent dans la base de données * de la côte ouest, la première source de données de délégation doit être utilisée. Par exemple : * public String createAccount(String accountId, float balance) { // Définit la source de données à laquelle cette transaction doit accéder. // Si l'ID du compte commence par "W", l'EJB CMP accède à la première source de données. // Sinon, la seconde source de données est utilisée. 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 { /** Nom JNDI de l'utilisateur pour rechercher une instance de WSProxyDataSourceHelper */ String JNDI_NAME = "java:comp/env/com/ibm/websphere/proxyds/WSProxyDataSourceHelper"; /** * Résolvez la référence de la source de données pour obtenir le nom JNDI global. Par exemple, * si la référence de ressource "jdbc/myDS1" est mappé à une source de données associée au nom * JNDI global "jdbc/Bank1", resolveDataSourceReference("jdbc/myDS1") renvoie la valeur * "jdbc/Bank1". * * @param dsResRefName Nom de la référence de ressource * @return Nom JNDI global de la source de données résolu pour cette référence de ressource. * @exception ResRefNotFoundException indique que le nom de la référence de la ressource * est introuvable. */ String resolveDataSourceReference(String dsResRefName) throws ResRefNotFoundException; /** * * Définissez le nom JNDI (pas le nom de référence de la ressource) de la source de données * à laquelle la transaction en cours doit accéder. A l'heure actuelle, une seule transaction peut * accéder à plusieurs sources de données proxy. Toutefois, pour une source de données proxy * spécifique, une seule source de données de délégation est accessible. * * Par exemple, il y a deux source de données proxy possédant le nom JNDI "jdbc/proxy1" * et "jdbc/proxy2". Les sources de données déléguées de la source de données "jdbc/proxy1" * sont "jdbc/ds1" et "jdbc/ds2". Les sources de données déléguées de la source de données * proxy "jdbc/proxy2" sont "jdbc/ds3" et "jdbc/ds4". Dans une transaction, vous pouvez * accéder à la fois à "jdbc/proxy1" et à "jdbc/proxy2". Toutefois, vous ne pouvez pas * accéder aux deux sources de données déléguées "jdbc/ds1" et "jdbc/ds2" de la source de * données proxy "jdbc/proxy1". Vous ne pouvez pas non plus accéder aux sources de données * déléguées "jdbc/ds3" et "jdbc/ds4" de la source de données proxy "jdbc/proxy2". * * * Lors de la phase de développement, les développeurs ne peuvent pas connaître le nom JNDI * global de la source de données à laquelle une référence de ressource doit être mappée. Le * seul élément connu est la nom de la référence de ressource. La procédure recommandée consiste * à appeler la méthode resolveDataSourceReference(String) pour extraire le nom JNDI de la source * de données mappée, puis d'appeler setCurrentDataSourceJndiName(String, String) avec le nom JNDI * global. * * @param proxyJndiName Nom JNDI de la source de données proxy * @param dsJndiName Nom JNDI de la source de données de délégation en cours */ void setCurrentDataSourceJndiName(String proxyJndiName, String dsJndiName); }
Related concepts
Programmation de la fonction de partitionnement