/** Il nome del riferimento risorse dell'origine dati proxy */ private static String proxyResRef = "jdbc/proxyDS"; /** Riferimento risorse dell'origine dati 1 */ private static String resRef1 = "jdbc/myDS1"; /** Riferimento risorse dell'origine dati 2 */ private static String resRef2 = "jdbc/myDS2"; /** Nome JNDI dell'origine dati per il riferimento risorse dell'origine dati 1 */ private String globalDSJNDIName1 = null; /** Nome JNDI dell'origine dati per il riferimento risorse dell'origine dati 2 */ private String globalDSJNDIName2 = null; /** Nome JNDI dell'origine dati globale per il riferimento risorse dell'origine dati proxy */ private String globalProxyDSJNDIName = null;È definita anche un'istanza WSProxyDataSourceHelper in modo che il bean di sessione la possa utilizzare per risolvere il nome JNDI dell'origine dati e impostare il nome JNDI dell'origine dati per la transazione.
/** * l'istanza WSProxyDataSourceHelper utilizzata per impostare il nome JNDI dell'origine dati * per la transazione corrente e risolve il riferimento risorse dell'origine dati * al nome JNDI globale */ WSProxyDataSourceHelper dsHelper = null;Di seguito è riportato il metodo setSessionContext:
public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; // Ricercare WSProxyDataSourceHelper e le directory principali locali EJB try { InitialContext ic = new InitialContext(); dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); accountHome = (AccountLocalHome) ic.lookup(accountHomeJNDIName); accountOwnerHome = (AccountOwnerLocalHome) ic.lookup(accountOwnerHomeJNDIName); } catch (Exception e) { throw new EJBException(e); } // Richiama il nome server AdminService service = AdminServiceFactory.getAdminService(); SERVER_NAME = service.getCellName() + "/" + service.getNodeName() + "/" + AdminServiceFactory.getAdminService().getProcessName(); // Risolve i riferimenti risorse sui nomi JNDI dell'origine dati globale try { globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1); globalDSJNDIName2 = dsHelper.resolveDataSourceReference(resRef2); globalProxyDSJNDIName = dsHelper.resolveDataSourceReference(proxyResRef); } catch (ResRefNotFoundException rrnfe) { throw new EJBException(rrnfe);Ricercare WSProxyDataSourceHelper dallo spazio dei nomi JNDI utilizzando la seguente istruzione:
dsHelper = (WSProxyDataSourceHelper ) ic.lookup(WSProxyDataSourceHelper .JNDI_NAME);Quindi ricercare, AccountLocalHome e AccountOwnerLocalHome. Successivamente, utilizzare l'API AdminService per richiamare il nome del server. Utilizzare questo nome server per verificare che l'indirizzamento della partizione sia corretto. Gli utenti non devono effettuare questa operazione nelle proprie applicazioni. Il runtime dell'utilità di partizione garantisce il funzionamento corretto dell'indirizzamento delle partizioni.
globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1);In fase di sviluppo dell'applicazione, lo sviluppatore non conosce il nome JNDI a cui verrà associato questo riferimento risorse. Il componente dell'origine dati proxy fornisce un'API per l'applicazione per richiamare il nome JNDI dell'origine dati. Tale origine dati dei nomi JNDI verrà utilizzata per indicare al runtime quale origine dati utilizzare.
/** * prelievo di denaro da un conto * @param accountId * @param amount * @return * @throws InSufficientFundException */ public String withdraw(String accountId, float amount) throws InSufficientFundException { // Imposta l'origine dati a cui accederà tale transazione. setDataSource(accountId); try { AccountLocal account = accountHome.findByPrimaryKey(accountId); account.withdraw(amount); } catch (ObjectNotFoundException onfe) { throw new EJBException(onfe); } catch (FinderException fe) { throw new EJBException(fe); } return SERVER_NAME; }La differenza tra questo metodo e un metodo normale sta nel fatto che è stata aggiunta la seguente istruzione:
// Imposta l'origine dati a cui accederà tale transazione. setDataSource(accountId);Di seguito è riportato il metodo setDataSource:
/** * Imposta l'origine dati che CMP utilizzerà per la transazione corrente. * Se accountID inizia con W, allora verrà utilizzata l'origine dati 1. Se invece l'accountID * inizia con E, verrà utilizzata l'origine dati 2. * * @param s */ private void setDataSource(String s) { if (s.startsWith("W")) { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName1); } else { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName2); } }Il metodo setDataSource utilizza WSProxyDataSourceHelper per impostare il nome JNDI dell'origine dati corrente per la transazione corrente. Se accountId inizia con W, che significa che l'ID account deve essere memorizzato nel database della costa ovest, allora il nome JNDI globalDSJNDIName1 verrà impostato sul thread. Se invece accountId inizia con E, che significa che l'ID account deve essere memorizzato nel database della costa est, allora il nome JNDI globalDSJNDIName2 verrà impostato sul thread.
A questo punto, l'applicazione è stata abilitata con il supporto dell'origine dati proxy. Il passo successivo consiste nel configurare le origini dati DB2 e l'origine dati proxy.