1

i need serious help please!! i am stuck from 10 days in same problem :/ !!

i have a web application with java8 that was deployed in WAS and i am migrating it to tomcat 7.

I integrated the app in spring boot 1.5.22 and it works correctly till now but DB connection still doesn't work. I want to connect it to oracle 10g using OJDBC6.jar

In the DB configuration class i have this code :

import java.sql.Connection; import java.sql.SQLException; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class TDFAdminDBConnection { protected String JNDILookup = "rnz_fta/jdbc/Datasource"; protected DataSource ds = null; public TDFAdminDBConnection() {} public void freeConnection(Connection conn) throws SQLException { if(conn != null) conn.close();} public void connectToDataSource(String lookup) throws NamingException { try { InitialContext context = new InitialContext(); this.ds = (DataSource)context.lookup(lookup); context.close(); }catch(NamingException e) { System.out.println("connection failed ," + e.toString()); }} public Connection getConnection() throws SQLException { if(ds == null) { try { this.connectToDataSource(this.JNDILookup); }catch (NamingException e) { throw new SQLException(e.toString()); }} return this.ds.getConnection(); } public Connection getConnection(String lookup) throws NamingException, SQLException { Connection connection = null; InitialContext context = new InitialContext(); DataSource ds = (DataSource)context.lookup(lookup); connection = ds.getConnection(); context.close(); return connection; } } 

in the web.xml of the app i added this :

<resource-ref> <description>Oracle Datasource</description> <res-ref-name>rnz_fta/jdbc/Datasource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 

And i added same code to the external Tomcat web.xml;

In the server.xml i added this under :

<Resource auth="Container" global="rnz_fta/jdbc/Datasource" name="rnz_fta/jdbc/Datasource" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@xxx:1509:xxx" username="xxx" password="xxx" maxActive="20" maxIdle="10" maxWait="5000" /> 

And in context.xml i added this :

<ResourceLink name="rnz_fta/jdbc/Datasource" auth="Container" global="rnz_fta/jdbc/Datasource" type="javax.sql.DataSource" /> 

But i always get this error :

connection failed ,javax.naming.NameNotFoundException: Le Nom [rnz_fta/jdbc/Datasource] n'est pas lié à ce Contexte 

JNDI name is not related to this context I followed official Tomcat 7.0.108 documentation as the version i am using; Then i changed the DB config class like this :

import java.sql.Connection; import java.sql.SQLException; import oracle.jdbc.pool.OracleDataSource; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; public class TDFAdminDBConnection { protected String JNDILookup = "rnz_fta/jdbc/Datasource"; private LogService log_dbg; protected DataSource ds = null; public TDFAdminDBConnection() {} public void freeConnection(Connection conn) throws SQLException { if(conn != null) conn.close();} public void connectToDataSource(String lookup) throws NamingException { try { Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); this.ds = (DataSource)envCtx.lookup(lookup); envCtx.close(); }catch(NamingException e) { System.out.println("connection failed ," + e.toString()); } log_dbg.debug("datasource =" + ds);} public Connection getConnection() throws SQLException { if(ds == null) { try { this.connectToDataSource(this.JNDILookup); }catch (NamingException e ) { throw new SQLException(e.toString());}} log_dbg.debug("datasource =" + ds); return this.ds.getConnection();} public Connection getConnection(String lookup) throws NamingException, SQLException { Connection connection = null; Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource)envCtx.lookup(lookup); connection = ds.getConnection(); envCtx.close(); log_dbg.debug("datasource =" + ds); log_dbg.debug("connection =" + connection); return connection;}} But also didn't solve the problem !! 

I created a context.xml inside My app in /src/main/webapp/META-INF and added this code :

<?xml version="1.0" encoding="UTF-8"?> <Context docBase="C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\tdfadmin-0.0.1-SNAPSHOT.war" path="" reloadable="true" debug="1"> <Resource name="rnz_fta/jdbc/Datasource" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@xxx:1509:xxx" username="xxx" password="xxx" maxActive="20" maxIdle="10" maxWait="5000" removeAbandoned="true" removeAbandonedTimeout="30" logAbandoned="true"/> <ResourceLink global="rnz_fta/jdbc/Datasource" name="rnz_fta/jdbc/Datasource" type="javax.sql.DataSource"/> </Context> also same error !! i added ojdbc6.jar and tomcat-jdbc.jar in tomcat/lib and in vain!! 

even the property spring.datasource.jndi-name in app.properties didn't solve the problem :/

here are some of my maven dependencies :

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> 

Here is last line of console output in tomcat :

connection failed ,javax.naming.NameNotFoundException: Le Nom [rnz_fta/jdbc/Datasource] n'est pas lié à ce Contexte Sat Aug 14 17:44:38 CEST 2021 java.lang.NullPointerException at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) 

Here is the ControlerConnection class:

import java.sql.Connection; import java.sql.SQLException; public class ControlerConnection { protected Connection connection; public TDFAdminDBConnection tdfDBConnection = null; public ControlerConnection() { tdfDBConnection = new TDFAdminDBConnection(); } public void freeConnection(Connection conn) throws SQLException { tdfDBConnection.freeConnection(conn); } public void getConnection() throws SQLException { this.connection = tdfDBConnection.getConnection(); // connection.setAutoCommit(false); } } 

I am really stack!! does anyone had the same problem please??????

2 Answers 2

1

It would be better to follow the JNDI naming convention

 Resource Manager Connection Factory Type JNDI Subcontext JDBC™ javax.sql.DataSource java:comp/env/jdbc 

So on java something like:

 Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/rnzFtaDatasource"); 

The Resource global= attribute should at least start with jdbc.
Tomcat 7 docs on jdbc JDNI or Adding custom resource factories if you need your JDNI name starting with rnz_fta.

Sign up to request clarification or add additional context in comments.

5 Comments

Thank you so much , it helped me a lot and the error is gone: now the problem is that i still get java.lang.NullPointerException and "unknownHost" !! i tried to put the connection variable in a logger aand i found out that it's null !! it's not getting any value!! i edited my question and added the ControlerConnection class in the post that uses the DB config class!
Connections are handled by a pool class that reads the configuration. unknown host sounds like a DNS problem, check exceptions carefully to find more info or increase to debug level on pool package. The stack trace should give more clues. Also, try to use the newest jdbc driver possible
i used the same DB with the same ojdb6 jar in a previous application and they work together correctly but the difference is that the preivous app is springboot 2.5 and db config in app.properties directly not with the jndi. But this App is springBoot 1.5.22 with jndi config!
Thank you so much, i'll try to verify the db url in the config and add loggers
0

Solved! the problem is that i was using a wrong version of ojdbc driver ! ojdbc6-11.1.0.7.0.jar solved the problem

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.