JNDI Datasource

Olah pessoal,

Estou com um problema que não estou conseguindo resolver.

Estava usando o Tomcat 6 em uma aplicação onde eu tinha apenas um prototipo navegavel, ja com as Actions, os beans, DAOs, hibernate e Spring. Então como é por enquanto um sistema simples, resolvi mudar para o Tomcat 7. Porem não consigo fazer funcionar mais o JNDI data source. Verifiquei na documentação e me parece muito semelhante e não encontrei diferença na configuraçao.

Alguem ja conseguiu fazer funcionar?

o trecho do meu web.xml na pasta web-inf

<resource-ref> <description>ACOL DataSource</description> <res-ref-name>jdbc/ACOLDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

O trecho do meu server.xml

<GlobalNamingResources> <Resource driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="100" maxWait="10000" name="global/jdbc/acol" password="senha" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/meu_banco" username="usuario"/> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> </GlobalNamingResources>

Context.xml na pasta meta-inf

<Context> <ResourceLink name="jdbc/ACOLDS" global="global/jdbc/acol" type="javax.sql.DataSource"/> </Context>

O que mudou disso para o 7? O que preciso mudar para funcionar?

Muito Obrigado

Opa Vinicius, estou com o mesmo problema que você usando o TOMCAT 7 e levando uma surra pra funcionar também…

Você conseguiu resolver o problema ?
eu sei que seu post já é de 2009 e estamos em 2011 , não querendo exigir muito da sua memória.

Mas você optou pelo tomcat 6 ou conseguiu resolver a configuração ?

[]'s
:wink:

Então…

Acabei optando pelo 6. Agora estou começando outro projeto com o 7 e fui ver se estava funcionando ja… Mas ao entrar no how-to da propria apache ele estava explicando para fazer no global e em baixo tinha uma anotação dizendo que o autor do how-to não tinha conseguido fazer funcionar, então em vez de deixar global estou usando no contexto da aplicação mesmo.

Espero ter ajudado, qualquer coisa só perguntar.

Obrigado por responder Vinicius…

Eu já tentei de tudo :

No Server.xml do tomcat 7 dentro da Tag já coloquei direto o Resource assim

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<Resource name="jdbc/MyDB" 
          auth="Container" 
          type="javax.sql.DataSource" 
          username="system" 
          password="******" 
          driverClassName="oracle.jdbc.OracleDriver" 
          url="jdbc:oracle:thin:@localhost:1521:xe" />
</Host>
 </Engine>
  </Service>
</Server>

Ou já tentei direto no projeto app/META-INF/context.xml , sem colocar no SERver.xml

<Context>
<Resource name="jdbc/MyDB" 
          auth="Container" 
          type="javax.sql.DataSource" 
          username="system" 
          password="******" 
          driverClassName="oracle.jdbc.OracleDriver" 
          url="jdbc:oracle:thin:@localhost:1521:xe" />
</Context>

e no persistence.xml

<persistence-unit name="myApps" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>jdbc/MyDB</jta-data-source>
		<class>br.com.myapps.entity.Files</class>
                <class>......</class>
               <properties>
		  <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
		  <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
                  <property name="hibernate.transaction.manager_lookup_class"  value="org.hibernate.transaction.JBossTransactionManagerLookup"/>

ou ainda no context.xml do Tomcat7/conf/

Com essa configuração o erro que sempre ocorre é :

org.hibernate.HibernateException: Could not find datasource org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79) ... .. javax.naming.NameNotFoundException: Name jdbc is not bound in this Context org.apache.naming.NamingContext.lookup(NamingContext.java:803)

Se você pudesse me esclarecer como está o seu , ou deixar um exemplo de como o seu está funcionando …
Ia ser uma mão na roda… já estou uns 3 dias nisso quebrando a cara rsrsrsrs

[]'s

Não é nenhum desses lugares, vc vai adicionar o resource no server.xml dentro do context da sua aplicação e depois vc precisa mapea-lo no web.xml para então usar na sua aplicação.

da uma olhada aqui q vc vai entender melhor http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

Abss

Ok fiz exatamente o que vc me passou no site:

CATALINA_HOME \lib - obdc14.jar ( do oracle )

no server.xml ( que tem que colocar o Context da minha aplicação esta exatamente assim ) , veja se é isso:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

<Context path="/myapp" docBase="myapp"
        debug="1" reloadable="true" crossContext="true">
	
		<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
			  username="system" password="******" maxActive="20" maxIdle="10"
              maxWait="-1"/> 
	</Context>
      </Host>
    </Engine>
  </Service>
</Server>

na miinha aplicacao tenho o web.xml que coloquei a referencia do datasource:

<resource-ref>
   <description>Web Database</description>
   <res-ref-name>jdbc/myoracle</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

e no meu persistence.xml faço o JNDI

org.hibernate.ejb.HibernatePersistence
jdbc/myoracle

quando acesso um Manager bean que faz a consulta ele dá erro no JNDI conforme abaixo:

javax.persistence.PersistenceException: [PersistenceUnit: myPersistence] Unable to build EntityManagerFactory
	org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
......

org.hibernate.HibernateException: Could not find datasource
	org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79)
....

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
	org.apache.naming.NamingContext.lookup(NamingContext.java:803)

Eu fiz um teste utilizando o abaixo que funcionou :

         Context initContext = new InitialContext();
    	 Context envContext  = (Context)initContext.lookup("java:/comp/env");
    	 DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
    	 Connection conn = ds.getConnection();
    	 Statement stmt = conn.createStatement();

Porém quando é no persistence.xml ele não encontra…
Estou quase lá hehehe você pode me mostrar como está seu persistence.xml ?

tentei assim:
jdbc/myoracle
e assim
java:/myoracle

ambos ocorre o mesmo erro!

Então eu não uso JPA e tambem não cuido desse parte, deixei tudo com o spring =D.

Mas ve se isso te ajuda http://www.guj.com.br/java/87502-jpa–jndi–locaweb-resolvido

Valeu Vinicius pela ajuda, Por fim consegui resolver,
e claro vou deixar aqui para os que forem usar o Tomcat 7 futuramente …

No server.xml ( tomcat7/conf/server.xml ) deixei dentro da Tag :

<Context path="/myApp" docBase="myApp"  debug="1" reloadable="true" crossContext="true">
		<Resource name="jdbc/myoracle" auth="Container" 
		      type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
			  username="system" password="*****" maxActive="20" maxIdle="10"
              maxWait="-1"/> 
	</Context>

E no persistence.xml eu só acrescentei a linha :

Portanto por completo fica assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

   <persistence-unit name="initConexao" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:comp/env/jdbc/myoracle</jta-data-source>

	<class>br.com.myApp.Objecto1</class>
	<class>br.com.myApp.Objecto2</class>
	...
	...
	<properties>
	   <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
	   <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" />
	   <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
	   <property name="hibernate.show_sql" value="false"/>
           <property name="hibernate.format_sql" value="true"/>
	</properties>
    </persistence-unit>
</persistence>

:smiley:

Valeu pela força e ajuda!!!
Taí p/ o pessoal que tiver o mesmo problema!

vlw jhieiy, eu tava com o mesmo problema porcausa da linha 14 do persistence que estava com JTA :stuck_out_tongue:

Esse arquivo persistence.xml fica em qual diretório??

Posso usar o hibernate.cfg.xml mesmo?

Valeu.