Trabalho com um sistema onde cada cliente tem um schema no banco de dados e temos um global.
Tudo estava funcionando mto bem até que cheguei a seguinte situação:
Preciso que: dentro de um método, primeiro eu faça uma consulta no banco A, dps uma inserção no banco B.
Estou tendo um problema :
org.jboss.util.NestedSQLException: Transaction is not active
Fazendo alguns testes notei que isso ocorre porque ele cria uma nova transação e isso essa transação para conectar no banco A, mas não cria outra para o banco B.
Assim sendo, depois de fazer minha consulta no banco A, não consigo fazer mais nada no banco B.
Eu poderia:
Cria a transação manualmente(péssimo)
Colocar a parte que consulta o banco A em outro método que cria uma nova transação para isso(não tão ruim, mas ainda ruim)
Andei lendo um pouco sobre XA e acho que seria o caso de usar aqui, alguém sabe me dizer se ela se encaixaria nesse caso?
Esse tipo de cenário será bem comum em meu projeto, ter q trabalhar com mais de um banco e fazer com que tudo seja uma única transação.
Alguém tem algum exemplo de como configurar o hibernate para trabalhar assim ? Algum link, qq coisa ajuda, dei uma olhada na net mas sequer sei se XA se encaixa nesse meu cenário.
Você pode configurar vários entity manager (igual o configurado no exemplo) cada um acessando um persistent unit diferente e depois usar as anotações @Transactional e @PersistenceContext (nessa ultima indicando o unit-name) que o spring já faz tudo para vc.
Ah, no seu persistence.xml o transaction-type tem que ser “JTA”.
Aqui nos temos casos também de duas aplicações em servidores separados, acessando bases diferentes e se comunicando através de EJB, tudo transacional. Caso precise disso e estiver usando jboss, aqui explica como faz http://www.jboss.org/community/docs/DOC-13179
Eu acessava 2 schemas diferentes do banco(O user tem permissão para tal).
Isso funciona bem para select(consigo dar um join cross-schema) mas nao funciona pra insert,update,delete(claro, transação cross-schema não rola sem XA).
O que eu fiz:
Agora tenho 2 tipos de DAOs, os que puxam do banco do cliente, e os que puxam do banco global.(Obviamente global tem suas entidades e local tem outras)
Pessoal, tô aproveitando este tópico pq o meu problema tem a ver com o assunto.
Eu tô usando o JBoss AS 5.1GA. Tentei criar dois data sources usando mas estou com um problema estranho.
Por algum motivo, o Eclipse está reclamando da estrutura do arquivo ds.xml
Eu estou colocando em anexo o printscreen do eclipse com a mensagem de erro.
O Curioso é que eu peguei um exemplo da página da JBoss e o erro é o mesmo.
Existe alguma coisa que estou vacilando ou é algum bug do eclipse? (Eu estou usando o plugin JBoss Tools 3)
Eu tentei acessar a DTD pelo browser mas houve um erro no parser do documento…
Aqui esta a estrutura completa do arquivo ds.xml
[code]<?xml version="1.0" encoding="UTF-8"?>
<xa-datasource>
<jndi-name>ExemploSeamDatasource2</jndi-name>
<track-connection-by-tx />
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:mysql://localhost:3306/exemploseam2</xa-datasource-property>
<xa-datasource-property name="User">xxx</xa-datasource-property>
<xa-datasource-property name="Password">xxx</xa-datasource-property>
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</xa-datasource>
<xa-datasource>
<jndi-name>GenericXADS</jndi-name>
<xa-datasource-class>[fully qualified name of class implementing
javax.sql.XADataSource goes here]</xa-datasource-class>
<xa-datasource-property name="SomeProperty">SomePropertyValue</xa-datasource-property>
<xa-datasource-property name="SomeOtherProperty">SomeOtherValue</xa-datasource-property>
<user-name>x</user-name>
<password>y</password>
<transaction-isolation>TRANSACTION_SERIALIZABLE</transaction-isolation>
<!--pooling parameters-->
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
<!--
sql to call when connection is created <new-connection-sql>some
arbitrary sql</new-connection-sql>
-->
<!--
sql to call on an existing pooled connection when it is obtained from
pool <check-valid-connection-sql>some arbitrary
sql</check-valid-connection-sql>
-->
<!-- pooling criteria. USE AT MOST ONE-->
<!--
If you don't use JAAS login modules or explicit login
getConnection(usr,pw) but rely on user/pw specified above, don't
specify anything here
-->
<!-- If you supply the usr/pw from a JAAS login module -->
<security-domain />
<!--
if your app supplies the usr/pw explicitly getConnection(usr, pw)
-->
<application-managed-security />
</xa-datasource>
[/code]
Outra dúvida: O fato de estar usando XA requer que o arquivo tenha o nome no formato XXX-xa-ds.xml? Ou posso deixar como XXX-ds.xml?