/** Der Name der Ressourcenreferenz für die Proxy-Datenquelle */ private static String proxyResRef = "jdbc/proxyDS"; /** Ressourcenreferenz 1 für Datenquelle */ private static String resRef1 = "jdbc/myDS1"; /** Ressourcenreferenz 2 für Datenquelle */ private static String resRef2 = "jdbc/myDS2"; /** Globaler JNDI-Name der Datenquelle für Ressourcenreferenz 1 */ private String globalDSJNDIName1 = null; /** Globaler JNDI-Name der Datenquelle für Ressourcenreferenz 2 */ private String globalDSJNDIName2 = null; /** Globaler JNDI-Name der Datenquelle für die Proxy-DataSource-Ressourcenreferenz*/ private String globalProxyDSJNDIName = null;Außerdem definieren Sie eine WSProxyDataSourceHelper-Instanz, damit die Session-Bean diese verwenden kann, um den JNDI-Namen der Datenquelle aufzulösen und den JNDI-Namen der Datenquelle für die Transaktion festzulegen.
/** * Die WSProxyDataSourceHelper-Instanz, die verwendet wird, um den JNDI-Namen * der Datenquelle für die aktuelle Transaktion festzulegen und die Ressourcenreferenz * für die Datenquelle in den globalen JNDI-Namen aufzulösen. */ WSProxyDataSourceHelper dsHelper = null;Im Folgenden wird die Methode setSessionContext gezeigt:
public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; // WSProxyDataSourceHelper und Local-Home-Interfaces der EJB suchen 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); } // Servernamen abrufen AdminService service = AdminServiceFactory.getAdminService(); SERVER_NAME = service.getCellName() + "/" + service.getNodeName() + "/" + AdminServiceFactory.getAdminService().getProcessName(); // Ressourcenreferenz in globale JNDI-Namen für Datenquelle auflösen try { globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1); globalDSJNDIName2 = dsHelper.resolveDataSourceReference(resRef2); globalProxyDSJNDIName = dsHelper.resolveDataSourceReference(proxyResRef); } catch (ResRefNotFoundException rrnfe) { throw new EJBException(rrnfe);Verwenden Sie die folgende Anweisung, um die WSProxyDataSourceHelper-Instanz im JNDI-Namespace zu suchen:
dsHelper = (WSProxyDataSourceHelper ) ic.lookup(WSProxyDataSourceHelper .JNDI_NAME);Suchen Sie anschließend wie gewohnt AccountLocalHome und AccountOwnerLocalHome. Rufen Sie danach mit der API AdminService den Servernamen ab. Mit diesem Servernamen können Sie prüfen, ob die Partitions-Routing ordnungsgemäß funktioniert. Der Benutzer selbst muss dies in seiner Anwendung nicht tun. Die WPF-Laufzeitumgebung gewährleistet ein ordnungsgemäßes Partitions-Routing.
globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1);Während der Anwendungsentwicklung ist dem Entwickler nicht bekannt, welchem JNDI-Namen diese Ressourcenreferenz zugeordnet wird. Die Komponente Proxy DataSource stellt eine API bereit, mit der die Anwendung den JNDI-Namen der Datenquelle abrufen kann. Dieser JNDI-Name wird verwendet, um der Laufzeitumgebung die zu verwendende Datenquelle mitzuteilen.
/** * Geld von einem Konto abheben * @param accountId * @param amount * @return * @throws InSufficientFundException */ public String withdraw(String accountId, float amount) throws InSufficientFundException { // Datenquelle angeben, auf die diese Transaktion zugreift 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; }Der Unterschied zwischen dieser Methode und einer normalen Methode ist die folgende hinzugefügte Anweisung:
// Datenquelle angeben, auf die diese Transaktion zugreift setDataSource(accountId);Im Folgenden wird die Methode setDataSource gezeigt:
/** * Datenquelle angeben, die die CMP für die aktuelle Transaktion verwendet. * Wenn die accountID mit W beginnt, wird die Datenquelle 1 verwendet. * Beginnt die accountID mit E, wird die Datenquelle 2 verwendet. * * @param s */ private void setDataSource(String s) { if (s.startsWith("W")) { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName1); } else { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName2); } }Die Methode setDataSource verwendet WSProxyDataSourceHelper, um den Namen der aktuellen Datenquelle für die aktuelle Transaktion zu setzen. Wenn die accountId mit "W" beginnt, was bedeutet, dass die Konto-ID in der Datenbank an der Westküste gespeichert werden soll, wird der JNDI-Name globalDSJNDIName1 im Thread definiert. Beginnt die Konto-ID mit "E", was bedeutet, dass die Konto-ID in der Datenbank an der Ostküste gespeichert werden soll, wird der JNDI-Name globalDSJNDIName2 im Thread definiert.
Jetzt ist in Ihrer Anwendung die Unterstützung von Proxy-Datenquellen aktiviert. Im nächsten Schritt wird demonstriert, wie Sie die DB2-Datenquellen und die Proxy-Datenquelle konfigurieren.