Controle de transações através do JBoss

24/07/2009

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

Curtidas 0

Respostas

Dyego Carmo

Dyego Carmo

24/07/2009

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 !

GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

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.
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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 !
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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/
GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Bom dia, Dyego.

Aqui utilizamos JBoss.

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

Obrigado
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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 ?


GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Entendi.
Obrigado, Dyego.
Valeu
GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

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


GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

Qual a versão do JBoss ?

GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

GA 4.2.2

Obrigado
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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 ?
GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

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
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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


GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

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
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

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 ?

GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Até onde eu sei, nenhum filtro estava sendo utilizado.

Será que falta alguma lib do TopLink?  Estamos utilizando as libs abaixo:

toplink-essentials.jar
toplink-essentials-agent.jar


Obrigado

GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

No seu persistence.xml tente adicionar:

<property name="toplink.target-server" value="JBoss"/>
Me avise se funcionar.;

GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Não dá...

Exception Description: ClassNotFound: [JBoss] specified in [toplink.target-server] property.
Internal Exception: java.lang.ClassNotFoundException: No ClassLoaders found for: JBoss


Segundo a documentação do toplink, os valores válidos para a propriedade toplink.target-server são:
None - configure the persistence provider to use no application server. OC4J_10_1_3 - configure the persistence provider to use OC4J 10.1.3.0. SunAS9 - configure the persistence provider to use Sun Application Server version 9.Obrigado
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

teste:



<property name="toplink.target-server" value="oracle.toplink.essentials.platform.server.jboss.JBossPlatform"/>
GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

É isso que é muito estranho...
A lib do toplink não tem essas classes...
veja a figura...
obrigado



GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

Funcionou ?

GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Não... pois não tem a classe que mencionou na lib do toplink.
vou baixar a última versão do toplink e fazer o teste.

em seguida lhe aviso.

obrigado
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

Voce pode tentar trocar o Toplink essentials (que eh uma versao CAPADA do Toplink normal) pelo EclipseLink que eh o Codigo DOEADO da oracle para a fundacao Eclipse

Ai voce rpecisa da seguinte linha :

<property
name="eclipselink.target-server"
value="org.eclipse.persistence.platform.server.jboss.JBossPlatform"/>

Eu verifiquei o jar e tem a classe lká...

Download: http://www.eclipse.org/downloads/download.php?file=/rt/eclipselink/releases/1.1.1/eclipselink-1.1.1.v20090430-r4097.zip&url=http://mirror.cc.vt.edu/pub/eclipse/rt/eclipselink/releases/1.1.1/eclipselink-1.1.1.v20090430-r4097.zip&mirror_id=504
GOSTEI 0
Alan Santos

Alan Santos

24/07/2009

Baixei a versão 11.1.1 do toplink e nessa versão tem as classes do JBoss.

vou modificar a configuração e fazer os testes.... porém como estamos em momento de entrega de um módulo para um cliente, a correria está total, entende...

só poderei fazer esses testes na próxima semana.

funcionando ou não, lhe informo do resultado.

obrigado
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/07/2009

OK,

Fico no aguardo da sua resposta :)

GOSTEI 0
Devmedia

Devmedia

24/07/2009

Alan,
os testes foram satisfatórios? Podemos encerrar o chamado?
GOSTEI 0
Devmedia

Devmedia

24/07/2009

Alan,
por falta de retorno estamos encerrando o chamado. Caso ainda tenha dúvidas sobre o assunto aqui tratado, por favor, volte a posta aqui mesmo que o consultor voltará a lhe atender.
GOSTEI 0
POSTAR