JNDI Datasource

9 respostas
V

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

9 Respostas

J

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:

V

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.

J

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

V

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

J

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!

V

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

J

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!

L

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

M

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

Posso usar o hibernate.cfg.xml mesmo?

Valeu.

Criado 1 de julho de 2010
Ultima resposta 18 de out. de 2012
Respostas 9
Participantes 4