Jpa + Jndi + Tomcat

Bom dia pessoal.
Estou pesquisando sobre jndi + tomcat + jpa,

entao no meu persistence.xml eu coloquei

<non-jta-data-source>java:comp/env/jdbc/apl</non-jta-data-source>

e no context.xml do tomcat (tomcat/conf)

eu coloquei


<Context>
 <Resource   
 name="jdbc/apl"   
 auth="Container"   
 type="javax.sql.DataSource"   
 factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"   
 username="x"   
 password="y"   
 driverClassName="org.postgresql.Driver"   
 url="jdbc:postgresql://localhost:5432/APL"   
 maxActive="20"   
 maxIdle="5"   
 maxWait="15000"   
 validationQuery="select current_date"   
 removeAbandoned="true"   
 removeAbandonedTimeout="30"   
 logAbandoned="true" />   

</Context>

porem ele lanca esta exception

Caused by: org.hibernate.HibernateException: Could not find datasource

mas se eu comento esta linha e adiciono

<property name="connection.datasource"> java:comp/env/jdbc/apl </property>

ele funciona numa boa, minha pergunta é qual a diferenca deste dois modos apresentados, caso eu use ultimo eu estou usando pool de conexoes???

este meu persistence completo


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

	<persistence-unit name="aplpu" transaction-type="RESOURCE_LOCAL">
		<!--		<non-jta-data-source>java:comp/env/jdbc/apl-->
<!--		</non-jta-data-source>-->
		<provider>org.hibernate.ejb.HibernatePersistence
		</provider>
		//minhas classes

		<properties>
	<property name="connection.datasource">
		java:comp/env/jdbc/apl
        </property>

			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/APL" />
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.connection.password" value="x" />
			<property name="hibernate.connection.username" value="y" />
			<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
		</properties>
	</persistence-unit>

</persistence>

isto é correto???

vlews t+ pessoal!! :smiley: :smiley: :smiley:

A partir do momento que você comentou o “connection.datasource” você perdeu o pool de conexões. O Pool ocorre quando o container te oferece as conexões (através de Datasource).

Aconselho a dar uma estudada em Datasource simples primeiro e depois tente integrá-lo com o JPA. Aqui tem um exemplo de como fazer um DataSource no tomcat (final do post). http://www.jairrillo.com/blog/2007/10/24/installing-and-configurating-apache-tomcat-55-and-6x-windows-and-linux/

opa jr blz??? obrigado pela resposta, mas no meu persistence.xml eu comentei esta linha

[code]

[/code]

entao a aplicacao funciona busca no banco corretamente. Mas com esta configuracao eu ja estaria usando jndi???

estava olhando no site do apache e vi o exemplo com jdbc

eles sempre alocam e desalocam recursos no processamento

exemplo

try{
//abre conexao, resultset, statement reliza processamento e fecha tudo

}catch{
}finally{
confirma os fechamentos
}

entao no caso com jpa devo proceder da mesma maneira???

obrigado e vles :smiley: :smiley:

No caso do JPA, para você “liberar” uma conexão, ou seja, enviar ela novamente para o servidor, você deve fechar o EntityMananger em.close(). Porém se você estiver em um ambiente JEE, ai o próprio container faz isso para você.

Aconselho dar uma estudada mais nessa parte :slight_smile:

vou ter que estudar mesmo, pq nao entendi nada quando voce falou isso

e no caso como eu sei que estou usando jndi. há alguma maneira de monitorar por exemplo quantas conexoes estao livres, coisa desse tipo.

pq eu coloquei estas configuracoes no context.xml do tomcat, no meu persistence.xml, mas eu mesmo nao notei nada de diferenca!!!
Por isso não sei se configurei corretamente.

Tenho ainda 2 duvidas,
1- Estas condgiracoes são sufucientes para a configuração?
2 - Como eu sei que estou usando jndi
3- O significado desta linha

<non-jta-data-source>java:comp/env/jdbc/apl</non-jta-data-source>  

mas muita gente usa ela quando pesquiso sobre jndi + tomcat + jpa.

vlws pela resposta =)

Se você está buscando a conexão do datasource ou não em um ambiente de desenvolvimento (onde só você está usando o sistema), você realmente não vai sentir diferença. A diferença será nitida em um ambiente de produção, quando várias pessoas estiverem usando o sistema simultâneamente.

Você consegue ver quantas conexões estão abertas no BANCO DE DADOS (isso varia de banco para banco).

Você conhece JTA? Se não, dê uma pesquisada nele, pois ai você vai entender o non-jta-data-source e jta-data-source :slight_smile: , mas só adiantando, isso ai quer dizer que vai usar o datasource (vindo do tomcat), porém ele não vai gerenciar as transações através do JTA.

Entendi. Se eu colocar aquela linha o tomcat que ira controlar minhas transacoes.
Mas quando eu a coloco da exception isso quer dizer que nao estou usando jndi?

No meu codigo tem

em.getTransaction().begin()
//processaomento
em.getTransaction().commit()

seu eu colocar pra ele controlar minhas transacoes, o codigo acima tera que ser mudado ou algo do tipo???

desculpe tantas perguntas, mas tenho muitas duvidas ainda

vlw pelas respostas!!!

[quote=Vanderbill]Entendi. Se eu colocar aquela linha o tomcat que ira controlar minhas transacoes.
[/quote]

Não, pois você está setando “”, ou seja, NON. Se fosse jta-data-source a coisa seria diferente.

Quando você controla a transação, você de fato precisa usar o em.getTransaction().begin() e commit(), porém quando você deixa isso a cargo do servidor, você pode omitir essas linhas (aconselho estudar um pouco mais sobre transações, unit of work, e etc).

O assunto é bastante amplo, portanto aconselho você a estudar a parte de transação do JPA completa (JTA e RESOURCE_LOCAL). Certamente as coisas irão ficar mais claras para você.

ta comecando clarear as coisas, entao (eu acho :smiley: :smiley: )

devo colocar nonJta, e no caso ainda terei que mudar o transaction type de Resource_local para JTA.
Como no meu context eu defini as propriedades do banco essas coisas nao precisarei colocar isto no persistence.xml e devera funcionar.
Correto???

vlws pelas resposta, to lendo o doc do hibernate mas parece meio vago :smiley:

Quando você vai usar a conexão vinda do DataSource, no seu persistence.xml você NÃO PRECISA COLOCAR USUÁRIO/SENHA, HOST, ETC ETC ETC. Os dados da conexão já vai vir pronta do DataSource, e consequentemente, haverá o pool de conexão.

Eu te aconselho a ler o seguinte livro sobre JPA. Pro EJB3 Java Persistence API - Apress http://www.amazon.com/Pro-EJB-Java-Persistence-API/dp/1590596455.

Vai com calma, com o tempo as coisas vão ficando mais claras

entao chegamos no ponto que eu queria saber jr.

Se eu configurar o context do tomcat com meus resources, nao precisarei definir nada de usuario essas coisas no persistence xml e tera que funcionar, pois assim terei ctza que estou usando o pool de conexoes.

Quando é meu web container que controla transacoes meu transaction type nao sera resource local e sim JTA, consequetemente nao precisarei
controlar transacoes e quando quiser persistir algo no banco usarei somente.

em.persist(myBean);

isso que eu entendi até agora. Agradeço muito sua paciencia e por compartilhar o seu conhecimento. Muito obrigado mesmo!!! :smiley: :smiley: :smiley:

Está no caminho certo :wink:

Agora tem um detalhe que eu não posso te dar 100% de certeza (isso você vai ter que pesquisar sozinho), é se o Tomcat consegue controlar as transações usando JTA. Pelo que eu saiba, isso só é feito em um container J2EE/JEE full (como JBOss, Glassfish, Websphere, etc). O que eu sei é que você pode usar o Spring + JTA + Tomcat para fazer o controle de transação, mas o Tomcat + JTA sozinho eu acho que não rola.

Repare que estou falando a nível de transação e não a nível de JNDI DataSource (que isso funciona 100% no tomcat).

entendi jr, realmente acho que eu mesmo vou controlar minhas transacoes por enquanto.
Mas eu quero fazer pool de conexoes

ou seja vou configurar os resources no tomcat e tirar as configuracoes no persitence.xml e colocar o nonjta pois eu que vou fazer controle das transacoes.
mas é necessario o uso dessa propriedade??

<property name="connection.datasource"> java:comp/env/jdbc/apl </property>

Obrigado t+!

ela que vai buscar o DataSource do servidor :slight_smile:

O que você pode tirar é o non-jta-data-source e deixar como RESOURCE_LOCAL no seu persistence.xml

blz, neste modo que voce falou ja esta funcionando ou seja ja tenho pool de conexoes.

vlw muito obrigado. Achei aquele livreo que voce me falou em portgues vou dar uma pesquisada para ver se esta bem traduzido ou nao!!!

Bom, não sei se é o lugar certo pra perguntar pq eu não estou usando JPA, mas vamos lá, to recebendo o seguinte erro quando tento subir a aplicação que to fazendo e não sei mais como arrumar isso, ja pesquisei bastante e ao meu ver parece estar tudo certinho

O erro:

Caused by: org.hibernate.HibernateException: Could not find datasource: java:comp/env/jdbc/ORACLE
	at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:82)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:137)
	at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:79)
	at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:448)

Estou usando Hibernate e vi em alguns artigos que se eu não quiser deixar o mesmo dataSource no TomCat pra várias aplicações tenho que colocar apenas o driver do oracle no diretório lib do tomCat (ja fiz isso)
Abaixo segue o que coloquei no meu web.xml:

<!-- DataSource Reference to BD Oracle -->
<resource-ref>            
   	 <description>Oracle Datasource </description>  
               <res-ref-name>jdbc/ORACLE</res-ref-name>  
		<res-type>javax.sql.DataSource</res-type>  
		<res-auth>Container</res-auth>  
</resource-ref> 

Agora o context.xml:

<Context path="/Teste3" docBase="Teste3"
      crossContext="true" reloadable="true" debug="5">
   
  <Resource name="jdbc/ORACLE" 
   auth="Container" 
   type="javax.sql.DataSource"
   factory="oracle.jdbc.pool.OracleDataSourceFactory"
   user="USER"
   password="PASS" 
   driverClassName="oracle.jdbc.OracleDriver"
   url="jdbc:oracle:thin:@10.1.6.2:1521:orcl"
   maxWait="-1" 
   maxActive="260"
   maxIdle="40"
   minIdle="10"
   removeAbandoned="true" 
   removeAbandonedTimeout="300" 
   logAbandoned="false"/>
  </Context>

Agora o que coloquei no arquivo hibernate.cfg.xml:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	<session-factory>
		<!-- Config -->
		<property name="connection.datasource">java:comp/env/jdbc/ORACLE</property>
		<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<property name="cache.use_query_cache">true</property>
		<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>		
		<property name="hbm2ddl.auto">update</property>
		<property name="max_fetch_depth">0</property>
		<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
	</session-factory>
	
</hibernate-configuration>

Se alguem puder ajudar…vlw.

E ai Vanderbill, vi seu post e to precisando de um help, estou desenvolvendo um aplicacao tbm com Spring + Hibernate + JPA. O problema é que preciso pegar o DataSource por JNDI, o dataSource ja esta configurado no Tomcat ja testei em outra aplicacao q pego o dataSource pelo spring.
Mas na aplicacao atual nao funciona, ele nao reconhece a configura do persistence.xml

    &lt;persistence-unit name="WebApplication4PU" transaction-type="RESOURCE_LOCAL"&gt;
        &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
        &lt;class&gt;webapplication4.entity.Cliente&lt;/class&gt;
        &lt;class&gt;webapplication4.entity.Distribuidor&lt;/class&gt;
        &lt;exclude-unlisted-classes&gt;true&lt;/exclude-unlisted-classes&gt;

        &lt;properties&gt;
            &lt;property name="connection.datasource" value="java:comp/env/jdbc/jndi_postgres_adm"/&gt;
            &lt;property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/&gt;
        &lt;/properties&gt;
    &lt;/persistence-unit&gt;

exception

java.lang.UnsupportedOperationException: The user must supply a JDBC connection
        at org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:30)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
        at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
        at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
        at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:330)

alguem ja viu isso

Oct 7, 2009 5:58:20 PM com.sun.jersey.server.impl.application.WebApplicationImpl mapMappableContainerException
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NoClassDefFoundError: com/sun/appserv/jdbc/DataSource
	at com.citespace.citespacews.MyResource.getIt(MyResource.java:32)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:156)
	at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
	at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)
	at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)
	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)
	at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)
	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:736)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:701)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:692)
	at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:339)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:452)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:633)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: com.sun.appserv.jdbc.DataSource
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 30 more
Oct 7, 2009 5:58:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Jersey Web Application threw exception
java.lang.ClassNotFoundException: com.sun.appserv.jdbc.DataSource