/** Nom de la référence de ressource de la source de données proxy */ private static String proxyResRef = "jdbc/proxyDS"; /** Référence de ressource de la source de données 1 */ private static String resRef1 = "jdbc/myDS1"; /** Référence de ressource de la source de données 2 */ private static String resRef2 = "jdbc/myDS2"; /** Nom JNDI global de la source de données pour la référence de ressource de la source de données 1 */ private String globalDSJNDIName1 = null; /** Nom JNDI global de la source de données pour la référence de ressource de la source de données 2 */ private String globalDSJNDIName2 = null; /** Nom JNDI global de la source de données globale pour la référence de ressource de la source de données */ private String globalProxyDSJNDIName = null;Une instance WSDataSourceHelper est également définie afin que le bean session puisse l'utiliser pour résoudre le nom JNDI de la source de données et définir le nom JNDI de la source de données pour la transaction.
/** * Instance WSProxyDataSourceHelper utilisée pour définir le nom JNDI de la source de données * pour la transaction en cours et résoudre la référence de ressource de la source de données * en nom JNDI global */ WSProxyDataSourceHelper dsHelper = null;La méthode setSessionContext suit :
public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; // Recherche de WSProxyDataSourceHelper et des interfaces home locales de l'EJB try { InitialContext ic = new InitialContext(); dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); accountHome = (AccountLocalHome) ic.lookup(accountHomeJNDIName); accountOwnerHome = (AccountOwnerLocalHome) ic.lookup(NomJNDITitulaireCompte); } catch (Exception e) { throw new EJBException(e); } // Extraction du nom du serveur AdminService service = AdminServiceFactory.getAdminService(); SERVER_NAME = service.getCellName() + "/" + service.getNodeName() + "/" + AdminServiceFactory.getAdminService().getProcessName(); // Résolution des références de ressources en noms JNDI de source de données globaux try { globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1); globalDSJNDIName2 = dsHelper.resolveDataSourceReference(resRef2); globalProxyDSJNDIName = dsHelper.resolveDataSourceReference(proxyResRef); } catch (ResRefNotFoundException rrnfe) { throw new EJBException(rrnfe);Recherchez WSProxyDataSourceHelper à partir de l'espace de nom JNDI à l'aide de l'instruction suivante :
dsHelper = (WSProxyDataSourceHelper ) ic.lookup(WSProxyDataSourceHelper .JNDI_NAME);Recherchez ensuite AccountLocalHome et AccountOwnerLocalHome sous leur forme standard. Utilisez ensuite L'API AdminService pour obtenir le nom du serveur. Le nom du serveur permet de vérifier que le routage vers la partition est correct. Les utilisateurs n'ont pas à effectuer cette opération dans leurs applications. L'environnement d'exécution de la fonction de partitionnement est chargé de vérifier que la procédure de routage vers les partitions s'effectue correctement.
globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1);Pendant la phase de développement de l'application, le développeur ne connaît pas le nom JNDI auquel cette référence de ressource doit être mappée. Le composant Source de données proxy fournit une API pour permettre à l'application d'obtenir le nom JNDI de la source de données. Ce nom JNDI est utilisé pour indiquer à l'environnement d'exécution la source de données à utiliser.
/** * Retrait d'argent d'un compte * @param ID compte * @param montant * @return * @throws InSufficientFundException */ public String withdraw(String ID compte, montant flottant) throws InSufficientFundException { // Définit la source de données à laquelle cette transaction doit accéder. setDataSource(ID compte); try { AccountLocal account = accountHome.findByPrimaryKey(ID compte); account.withdraw(montant); } catch (ObjectNotFoundException onfe) { throw new EJBException(onfe); } catch (FinderException fe) { throw new EJBException(fe); } return SERVER_NAME; }La différence entre cette méthode et une méthode standard est l'ajout de l'instruction suivante :
// Définit la source de données à laquelle cette transaction doit accéder. setDataSource(ID compte);La méthode setDataSource suit :
/** * Définit la source de données que CMP utilise pour la transaction en cours. * Si l'ID compte commence par W, la source de données 1 est utilisée. Si l'ID compte * commence par E, la source de données 2 est utilisée. * * @param s */ private void setDataSource(String s) { if (s.startsWith("W")) { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName1); } else { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName2); } }La méthode ssetDataSource utilise WSProxyDataSourceHelper pour définir le nom JNDI de la source de données active pour la transaction en cours. Si l'ID compte commence par W (c'est-à-dire qu'il doit être stocké dans la base de données de la côte ouest), le nom JNDI NomJNDISourceDonnéesglobal1 est défini dans cette unité d'exécution. Si l'ID compte commence par "E" (c'est-à-dire qu'il doit être stocké dans la base de données de la côte est), le nom JNDI NomJNDISourceDonnéesglobal2 est défini dans cette unité d'exécution.
Votre application est maintenant configurée avec le support de source de données proxy. L'étape suivante vous indique comment configurer les sources de données DB2 et la source de données proxy.