Die Haupt-API für die Unterstützung von Proxy-Datenquellen ist WSProxyDataSourceHelper. Das Interface WSProxyDataSourceHelper wird im Folgenden vorgestellt:
package com.ibm.websphere.proxyds; /** * * Das Interface WSProxyDataSourceHelper ist ein Interface, das für die * Unterstützung mehrerer CMP-Datenquellen verwendet wird. Diese Unterstützung * wird auch Proxy-Datenquelle genannt. Der Benutzer kann mit dem JNDI-Namen * WSProxyDataSourceHelper.JNDI_NAME Instanzen von WSProxyDataSourceHelper * im JNDI-Namespace suchen. * * Dieses Interface wird für die Unterstützung des Proxy-DataSource-Modells * verwendet. Das Interface WSDataSourceHelper, das das Proxy-DataSource-Modell * der Version 5 unterstützt, ist veraltet. Es wird dringend empfohlen, das * neue Interface zu verwenden, um die Vorteile des Proxy-DataSource-Modells * nutzen zu können. * * * Das Interface enthält zwei Helper-Methoden. * * resolveDataSourceReference(String): * Diese Helper-Methode wird verwendet, um den globalen JNDI-Namen * der Datenquelle aufzulösen, der einer Ressourcenreferenz zugeordnet * ist. Wenn beispielsweise eine Ressourcenreferenz "jdbc/myDS1" * einer Datenquelle mit dem globalen JNDI-Namen "jdbc/Bank1" * zugeordnet ist, gibt der Methodenaufruf resolveDataSourceReference("jdbc/myDS1") * den Wert "jdbc/Bank1" zurück. * * * setCurrentDataSourceJndiName(String, String): * Diese Methode wird verwendet, um den JNDI-Namen (nicht den * Ressourcenreferenznamen) der Delegierungsdatenquelle festzulegen, * auf die die aktuelle Transaktion zugreift. Der JNDI-Name der * Datenquelle kann mit der Methode resolveDataSourceReference(String) * abgerufen werden. * * * Es folgt ein Beispiel: * * * Eine Anwendung enthält die CMP-EJB "Account" (Konto). Die Kontodaten * sind auf zwei verschiedene DB2-Datenbankserver verteilt, von denen * sich einer an der amerikanischen Westküste, der andere an der amerikanischen * Ostküste befindet. Damit die CMP-EJB "Account" auf beide Datenbanken * zugreifen kann, wird das Proxy-DataSource-Modell eingesetzt. * * * Für die CMP-EJB "Account" ist die CMP-Verbindungs-Factory "jdbc/ProxyDS" * konfiguriert. Für die Session-Bean "AccountTransaction", die als Sitzungsfassade * für die CMP-EJB "Account" auftritt, sind drei Ressourcenreferenzen * konfiguriert: "jdbc/myDS1", "jdbc/myDS2" und "jdbc/proxy". * * * Im Verwaltungsbereich erstellt der Administrator zwei DB2-Datenquellen mit * den Namen "jdbc/Account1" und "jdbc/Account2", eine für die Datenbank an * der Westküste, die andere für die Datenbank an der Ostküste. Außerdem * erstellt der Administrator eine Proxy-Datenquelle mit dem Namen "jdbc/AccountProxy". * Das benutzerdefinierte Merkmal jndiNames dieser Proxy-Datenquelle hat den * Wert "jdbc/Account1;jdbc/Account2". * * * Bei der Implementierung werden die Datenquellenreferenzen "jdbc/myDS1" und "jdbc/myDS2" * den physischen Datenquellen "jdbc/Account1" und "jdbc/Account2" zugeordnet. * Die Datenquellenreferenz "jdbc/proxy" wird der physischen Proxy-Datenquelle * "jdbc/AccountProxy" zugeordnet. Die CMP-Verbindungs-Factory "jdbc/ProxyDS" * wird ebenfalls der physischen Proxy-Datenquelle "jdbc/AccountProxy" zugeordnet. * * * Zum Zeitpunkt der Entwicklung weiß die Anwendung nicht, welchen physischen * Datenquellen diese Ressourcenreferenzen zugeordnet werden. Um den * JNDI-Namen der physischen Datenquellen abzurufen, kann die Anwendung die * Datenquellen in der Methode setSessionContext mit dem folgenden Code * auflösen: * * // WSProxyDataSourceHelper suchen * dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); * ... * ds1JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS1"); * ds2JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS2"); * proxyJndiName = dsHelper.resolveDataSourceReference("jdbc/proxy"); * * * * Bevor die Session-Bean die CMP-EJBs aufruft, kann die Session-Bean mit der * Methode setCurrentDataSourceJndiName(String, String) anzeigen, welche * Delegierungsdatenquelle die jeweilige CMP-EJB verwendet. Für dieses * Beispiel gilt Folgendes: Wenn die Konto-ID (accountID) mit "W" beginnt, * d. h. die Daten sind in der Datenbank an der Westküste enthalten, wird * die erste Delegierungsdatenquelle verwendet. Beispiel: * public String createAccount(String accountId, float balance) { // Datenquelle festlegen, auf die diese Transaktion zugreift. // Wenn die Konto-ID mit "W" beginnt, greift die CMP-EJB auf die erste // Datenquelle zu, andernfalls wird die zweite Datenquelle verwendet. 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 { /** Der JNDI-Namen, mit dem der Benutzer Instanzen von WSProxyDataSourceHelper sucht */ String JNDI_NAME = "java:comp/env/com/ibm/websphere/proxyds/WSProxyDataSourceHelper"; /** * Datenquellenreferenz in globalen JNDI-Namen auflösen. Beispiel: * Wenn eine Ressourcenreferenz "jdbc/myDS1" einer Datenquelle mit dem * globalen JNDI-Namen "jdbc/Bank1" zugeordnet ist, gibt * resolveDataSourceReference("jdbc/myDS1") den Wert "jdbc/Bank1" zurück. * * @param dsResRefName Ressourcenreferenzname * @return Den aufgelösten globalen JNDI-Namen der Datenquelle für diese * Ressourcenreferenz. * @exception ResRefNotFoundException Zeigt an, dass der Ressourcenreferenzname * nicht gefunden wurde. */ String resolveDataSourceReference(String dsResRefName) throws ResRefNotFoundException; /** * * Den JNDI-Namen (nicht den Ressourcenreferenznamen) der Datenquelle festlegen, * auf den die aktuelle Transaktion zugreift. Derzeit kann eine Transaktion * auf mehrere Proxy-Datenquellen zugreifen. Für eine bestimmte Proxy-Datenquelle * kann nur auf eine Delegierungsdatenquelle zugegriffen werden. * * * Beispiel: Es sind zwei Proxy-Datenquellen mit den JNDI-Namen "jdbc/proxy1" * und "jdbc/proxy2" vorhanden. Die Delegierungsdatenquellen für die Proxy-Datenquelle * "jdbc/proxy1" sind "jdbc/ds1" und "jdbc/ds2". Die Delegierungsdatenquellen für die * Proxy-Datenquelle "jdbc/proxy2" sind "jdbc/ds3" und "jdbc/ds4". Sie können in einer * Transaktion auf "jdbc/proxy1" und "jdbc/proxy2" zugreifen. Es ist jedoch nicht möglich, * auf die beiden Delegierungsdatenquellen "jdbc/ds1" und "jdbc/ds2" für die Proxy-Datenquelle * "jdbc/proxy1" zuzugreifen. Auch der Zugriff auf die beiden Delegierungsdatenquellen "jdbc/ds3" * und "jdbc/ds4" für die Proxy-Datenquelle "jdbc/proxy2" ist nicht möglich. * * * Während der Entwicklung kann der Entwickler den globalen JNDI-Namen * der Datenquelle, der eine Ressourcenreferenz zugeordnet wird, nicht wissen. * Bekannt ist lediglich der Name der Ressourcenreferenz. Es wird empfohlen, * die Methode resolveDataSourceReference(String) aufzurufen, um den JNDI-Namen * der zugeordneten Datenquelle anzufordern, und anschließend * setCurrentDataSourceJndiName(String, String) mit dem globalen JNDI-Namen * aufzurufen. * * @param proxyJndiName Der JNDI-Name der Proxy-Datenquelle * @param dsJndiName Der Name der aktuellen Delegierungsdatenquelle */ void setCurrentDataSourceJndiName(String proxyJndiName, String dsJndiName); }
Related concepts
Programmierumgebung des Partitionierungs-Feature