Fórum Controle de transações através do JBoss #7931
24/07/2009
0
Gostaria da ajuda de vocês para resolver o seguinte problema:
Estamos desenvolvendo um projeto Java Web, utilizando JBoss 4.2.2.GA + Tomcat 5.5.25 + JPA + Struts2 + Oracle 10.
Como implementação JPA, estamos utilizando o Toplink Essentials.
A aplicação está funcionando muito bem. Mas estamos com uma dúvida técnica sobre a melhor maneira de controlar as transações de persistência dos dados no BD.
Atualmente, nossas classes Stateless realizam a persistência com códigos como o mostrado abaixo:
if( !em.getTransaction().isActive() )
em.getTransaction().begin();
em.persist(object);
em.getTransaction().commit();
A nossa dúvida é se seria possível (utilizando o toplink) remover os código em.getTransaction().begin() e em.getTransaction().commit() e deixar todo esse controle por parte do JBoss.
Com o Hibernate (por exemplo) sabemos que é possível trabalhar dessa forma, mas com o TopLink não estamos conseguindo realizar essa configuração.
A propósito, estamos utilizando Toplink ao invés de Hibernate pois fizemos um teste de performance e constatamos que, com a base de dados que está sendo utilizada e BD Oracle, o toplink chegou a ser de 3 a 4 vezes mais rápido.
Essa diferença de performance é comum ou depende de outras variáveis?
Obrigado
Alan Santos
Curtir tópico
+ 0Posts
24/07/2009
Dyego Carmo
Primeiramente gostaria de agradecer a sua confiança no nosso sistema de tira dúvidas,
Existe sim uma forma de fazer com que estas transacoes sejam feitas automaticamente , voce deve utilizar JTA , Java Transaction API... exitem varias formas de utiliza-la...
A mais automatica que existe é utilizar ela junto com EJB3... pois o JBoss faz a comunicacao direta com o JTA e quando voce entra dentro de um metodo ele já inicia a transacao... quando voce sai ele commita... eh praticamente mágico...
Existe esta possibilidade ?
Outra forma é utilizando Spring , que vai estar fazendo isto para voce tambem...
Quantoa escolha do TOPLINK... é tradicionalmente feita por quem usa banco de dados Oracle , pois ele tem algumas otimizações bem legais...
Valeu !
Gostei + 0
24/07/2009
Alan Santos
Como devo configurar? É necessário acrescentar alguma lib/biblioteca?
Quanto ao fato de controlar a transação no próprio Bean, isso traz algum impacto para a aplicação, seja de performance, segurança, escalabilidade, etc?
Muito obrigado.
Gostei + 0
24/07/2009
Dyego Carmo
Gostei + 0
24/07/2009
Dyego Carmo
Gostei + 0
27/07/2009
Alan Santos
Aqui utilizamos JBoss.
Poderia me orientar a fazer essa configuração no JBoss?
Obrigado
Gostei + 0
27/07/2009
Dyego Carmo
Gostei + 0
27/07/2009
Alan Santos
Obrigado, Dyego.
Valeu
Gostei + 0
06/08/2009
Alan Santos
A configuração é referente a EJB 3.
Nosso arquivo persistence.xml está configurado da seguinte forma:
<persistence-unit name="MyUnit" transaction-type="JTA">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<jta-data-source>java:jdbc/MyUnit</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="toplink.session.customizer" value="br.util.TopLinkSessionCustomizer" />
<property name="toplink.refresh" value="true" />
<property name="toplink.refresh.cascade" value="CascadeAllParts" />
<property name="toplink.cache.type.TbLogradouro" value="Full"/>
<!-- <property name="toplink.cache.type.default" value="NONE" /> -->
</properties>
</persistence-unit>
Perceba que está sendo usado transaction-type=JTA.
Fazemos a injeção de dependência do EntityManager da Seguinte maneira:
@Stateless
public class CanalBO implements CanalBOLocal{
@PersistenceContext(unitName="MyUnit")
EntityManager em;
Ao executar uma simples query de consulta como em.createQuery("SELECT t FROM TbCanal t WHERE t.flEnabled = 1 ORDER BY t.dsCanal");
ocorre o erro abaixo.
javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
O próprio erro informa que a transação não está ativa.
se iniciarmos a transação manualmente (em.getTransaction().begin()) a query acima funciona normalmente, mas precisamos que a transação seja controlada pelo JBoss
o que é necessário fazer?
Obrigado
Gostei + 0
06/08/2009
Dyego Carmo
Gostei + 0
06/08/2009
Alan Santos
Obrigado
Gostei + 0
08/08/2009
Dyego Carmo
Gostei + 0
10/08/2009
Alan Santos
Mas quando utilizávamos o hibernate nesse mesmo projeto, o controle da transação era feito pelo JBoss.
Não dá pra fazer o mesmo utilizando o Toplink?
Obrigado
Gostei + 0
10/08/2009
Dyego Carmo
Pois que eu saiba... somente atravez de JTA ou Spring que voce pode controlar automaticamente...
Outra possibilidade pode ser o uso do Spring...
Gostei + 0
10/08/2009
Alan Santos
Quando foi feita a mudança para toplink, nenhuma configuração foi modificada no jboss, apenas a troca das libs do hibernate por toplink.
Não existe a possibilidade de utilizarmos spring
Gostei + 0
11/08/2009
Dyego Carmo
Voces utilizavam algum tipo de filtro com o hibernate ?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)