A API principal para o suporte à origem de dados do proxy é WSProxyDataSourceHelper. A seguir está a interface WSProxyDataSourceHelper:
package com.ibm.websphere.proxyds; /** * A interface WSProxyDataSourceHelper é uma interface utilizada para suporte de * várias origens de dados de CMP (também chamadas Proxy DataSource). Os usuários podem consultar * uma instância de WSProxyDataSourceHelper do espaço de nome de JNDI utilizando o nome de JNDI * WSProxyDataSourceHelper.JNDI_NAME. * * Essa interface é utilizada para suportar o modelo do Proxy DataSource. A seção * interface WSDataSourceHelper que suporta o modelo V5 Proxy DataSource * foi reprovada. É altamente recomendado que os usuários utilizem essa interface para * que tenham os benefícios do modelo Proxy DataSource. * * Existem dois métodos auxiliares nessa interface. * * resolveDataSourceReference(String): * Este método auxiliar é utilizado para resolver o nome de JNDI global da * origem de dados associada a uma referência de recurso. * Por exemplo, se umareferência de recurso "jdbc/myDS1" for mapeada para uma origem de dados com nome * de JNDI global "jdbc/Bank1", a chamada de método resolveDataSourceReference("jdbc/myDS1") * retornará "jdbc/Bank1". * * * setCurrentDataSourceJndiName(String, String): * Este método é utilizado para definir o nome de JNDI (não o nome da referência de recurso) * O Delegate DataSource de um Proxy DataSource específico que a transação atual * acessará. O nome de JNDI do DataSource pode ser adquirido utilizando o * método resolveDataSourceReference(String). * * * Segue um exemplo: * * Um aplicativo possui uma "Conta" EJB CMP. Os dados da Conta * são espalhados em dois diferentes servidores de banco de dados DB2, um na costa oeste e o outro * na costa leste. Para que a Conta do EJB CMP * acesse ambos os bancos de dados, o modelo Proxy DataSource é utilizado. * * A Conta EJB CMP é configurada com o CMP Connection Factory "jdbc/ProxyDS". * O Bean de Sessão AccountTransaction, que atua como * a fachada da sessão para a Conta EJB CMP, é configurado com três * referências de recurso "jdbc/myDS1", "jdbc/myDS2" e "jdbc/proxy". * * No espaço de administração, o administrador cria duas origens de dados do DB2 * "jdbc/Account1" e "jdbc/Account2", uma para o banco de dados da consta oeste e a * outra para o banco de dados da costa leste. O administrador também cria um * Proxy DataSource "jdbc/Accountroxy". * A propriedade customizada jndiNames desse Proxy DataSource é configurada como * "jdbc/Account1;jdbc/Account2" * * Durante o tempo de implementação, as referências de origem de dados "jdbc/myDS1" e "jdbc/myDS2" * são mapeadas para as origens de dados físicas "jdbc/Account1" e "jdbc/Acocunt2". * A referência da origem de dados "jdbc/proxy" * é mapeada para a origem de dados de proxy física "jdbc/AccountProxy". A Connection Factory CMP * "jdbc/ProxyDS" também é mapeada para o mesmo Proxy DataSource físico "jdbc/AccountProxy". * * Durante o tempo de desenvolvimento, o aplicativo não sabe para quais * origens de dados físicas essas referências de recursos * são mapeadas. Para obter o nome de JNDI das origens de dados físicas, o aplicativo * pode resolver as origens de dados no método setSessionContext utilizando * o seguinte código: * * // Consulte WSProxyDataSourceHelper * dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); * ... * ds1JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS1"); * ds2JndiName = dsHelper.resolveDataSourceReference("jdbc/myDS2"); * proxyJndiName = dsHelper.resolveDataSourceReference("jdbc/proxy"); * * * Antes que o bean de sessão chame os EJBs de CMP, o bean de sessão pode utilizar * o método setCurrentDataSourceJndiName(String, String) para indicar qual * origem de dados delegada esse EJB CMP utilizará. Em nosso exemplo, se o ID da conta * começar com "W", o que significa que os dados residem no banco de dados da costa oeste, a * primeira origem de dados delegada deve ser utilizada. Por exemplo: * public String createAccount(String accountId, float balance) { // Definir a origem de dados que esta transação acessará. // Se o ID da conta começar com "W", o CMP acessará a primeira origem de dados; // Caso contrário, a segunda origem de dados será utilizada. 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 { /** O nome de JNDI para o usuário consultar uma instância de WSProxyDataSourceHelper */ String JNDI_NAME = "java:comp/env/com/ibm/websphere/proxyds/WSProxyDataSourceHelper"; /** * Resolva a referência da origem de dados para o nome de JNDI global. Por exemplo: * se uma referência de recurso "jdbc/myDS1" for mapeada para uma origem de * dados com o nome de JNDI global "jdbc/Bank1", resolveDataSourceReference * ("jdbc/myDS1") * retornará "jdbc/Bank1". * * @param dsResRefName nome da referência de recurso * @return o nome de JNDI global da origem de dados resolvido para esta * referência de recurso. * @exception ResRefNotFoundException indica que o nome da referência de * recurso não pode ser localizado. */ String resolveDataSourceReference(String dsResRefName) throws ResRefNotFoundException; /** * Configure o nome de JNDI (não o nome da referência de recurso) do Delegate DataSource * dados que a transação atual acessará. No momento, uma transação pode * acessar vários Proxy DataSources. No entanto, para um determinado Proxy * DataSource, apenas um Delegate DataSource pode ser acessado. * * Por exemplo, existem dois Proxy DataSources com o nome de JNDI "jdbc/proxy1" * e "jdbc/proxy2". Os Delegate DataSources para Proxy DataSource "jdbc/proxy1" * são "jdbc/ds1" e "jdbc/ds2". Os Delegate DataSources para Proxy DataSource * "jdbc/proxy2" são "jdbc/ds3" e "jdbc/ds4". Em uma transação, você pode * acessar "jdbc/proxy1" e "jdbc/proxy2". No entanto, você não pode acessar * Delegate DataSources "jdbc/ds1" e "jdbc/ds2" para a origem de dados do proxy * "jdbc/proxy1". Você não pode acessar Delegate DataSources "jdbc/ds3" * e "jdbc/ds4" para Proxy DataSource "jdbc/proxy2". * * Durante o desenvolvimento, os desenvolvedores não podem saber o nome de JNDI global * da origem de dados para o qual uma referência de recurso será mapeada. A seção * único fato conhecido é o nome da referência de recurso. A prática recomendada é * chamar o método resolveDataSourceReference(String) para obter o nome de JNDI da * origem de dados mapeada e, em seguida, chamar setCurrentDataSourceJndiName(String, String) * com o nome de JNDI global. * * @param proxyJndiName o nome de JNDI do Proxy DataSource * @param dsJndiName o nome de JNDI atual de Delegate DataSource */ void setCurrentDataSourceJndiName(String proxyJndiName, String dsJndiName); }
Related concepts
Programação do Recurso de Particionamento