Como retornar um XADataSource?

1 resposta
C

Buenos dias, meus amigos javeiros

eu estou querendo testar algumas coisas com transações distribuidas, e para tal preciso de um XADataSource. Só que quando eu chamo um DataSource previamente configurado, do JBoss, ele não me retorna um XADataSource, mas sim um DataSource. O que eu faço para conseguir isto ?

Obs.: Eu sei que ando perguntando bastante no fórum, mas é que estou começando com J2EE. Desculpem-me pelo inconveniente.

Código do db-ds.xml

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
  <xa-datasource>
    <max-pool-size>20</max-pool-size>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <jndi-name>DB</jndi-name>
    <track-connection-by-tx/>
    <isSameRM-override-value>true</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@127.0.0.1:7000:ora9i</xa-datasource-property>
    <xa-datasource-property name="User">myuser</xa-datasource-property>
    <xa-datasource-property name="Password">mypassword</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
	<no-tx-separate-pools/>
  </xa-datasource>

  <mbean code="org.jboss.resource.adapter.jdbc.xa.oracle.OracleXAExceptionFormatter" 
         name="jboss.jca:service=OracleXAExceptionFormatter">
    <depends optional-attribute-name="TransactionManagerService">jboss:service=TransactionManager</depends>
  </mbean>

</datasources>

1 Resposta

T

Se você quer deixar seu código super-amarrado no JBoss (e ainda numa determinada versão do JBoss), é possível pegar a conexão nativa com alguns truques. Basicamente você recebeu o DataSource como um objeto do tipo org.jboss… (não lembro os detalhes todos, mas é possível imprimir o tipo do objeto (getClass().getName()) ou usar o debugger de sua preferência.
Você então faz o cast para essa classe (veja o fonte do JBoss).
Essa classe tem um método que se chama getUnderlyingConnection ou getConnection (depende um pouco da versão).
Com essa conexão nativa você pode fazer o que bem entender, mas tome cuidado: como a conexão não é sua, feche a conexão obtida pelo DataSource original, não a conexão nativa.

Criado 14 de março de 2005
Ultima resposta 21 de mar. de 2005
Respostas 1
Participantes 2