Fórum Controle de transações através do JBoss #7931

24/07/2009

0

Caros, bom dia.

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

Alan Santos

Responder

Posts

24/07/2009

Dyego Carmo

Boa tarde !

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 !

Responder

Gostei + 0

24/07/2009

Alan Santos

Existe a possibilidade sim de utilizar JTA.

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.
Responder

Gostei + 0

24/07/2009

Dyego Carmo

A configuracao do JTA é feita automaticamente quando voce utiliza o Spring ou o EJB3(No caso Java EE) Caso contrario, voce vai ter que controlar ela manualmente tambem... O impacto de controlar a transacao pelos beans nao eh significativo, tendo em vista que estes beans sao parte da regra de negocio da sua aplicacao. Qualquer duvida me avise !
Responder

Gostei + 0

24/07/2009

Dyego Carmo

O problema pode ser abordado aqui: http://blog.springsource.com/2006/08/07/using-jpa-in-spring-without-referencing-spring/ E aqui: http://www.urubatan.com.br/suporte-do-spring-20-a-jpa-ficou-muito-bom-ainda-mais-se-usar-um-pouquinho-do-spring-annotation-junto-d/
Responder

Gostei + 0

27/07/2009

Alan Santos

Bom dia, Dyego.

Aqui utilizamos JBoss.

Poderia me orientar a fazer essa configuração no JBoss?

Obrigado
Responder

Gostei + 0

27/07/2009

Dyego Carmo

A configuracao referente a utilizacao do Spring ou EJB3 ? Repito... JTA não deve ser utilizado na mão , senao voces vao ter os mesmos problemas... vao ter que controlar o JTA na mao dai... pior ainda neh ?


Responder

Gostei + 0

27/07/2009

Alan Santos

Entendi.
Obrigado, Dyego.
Valeu
Responder

Gostei + 0

06/08/2009

Alan Santos

Olá, Dyego.

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


Responder

Gostei + 0

06/08/2009

Dyego Carmo

Qual a versão do JBoss ?

Responder

Gostei + 0

06/08/2009

Alan Santos

GA 4.2.2

Obrigado
Responder

Gostei + 0

08/08/2009

Dyego Carmo

Jboss 4.2 nao suporta Java EE 5...e sim apenas uma especie de EJB3 frankeintein.... mas a versao 5.0 suporte , existe a possibilidade de migracao ?
Responder

Gostei + 0

10/08/2009

Alan Santos

Sobre a possibilidade de mudar a versão do JBoss, será preciso verificar com o Cliente.
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
Responder

Gostei + 0

10/08/2009

Dyego Carmo

Você utilizava um filtro ?

Pois que eu saiba... somente atravez de JTA ou Spring que voce pode controlar automaticamente...

Outra possibilidade pode ser o uso do Spring...


Responder

Gostei + 0

10/08/2009

Alan Santos

Utilizávamos JTA com Hibernate.

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
Responder

Gostei + 0

11/08/2009

Dyego Carmo

Estranho, pois se o TOP LINK nao conectar no JTA do JBoss não tem conversa... nao vai funcionar...

Voces utilizavam algum tipo de filtro com o hibernate ?

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar