कृपया मुझे गंभीर मदद चाहिए !! मैं 10 दिनों से एक ही समस्या में फंस गया हूँ:/!!

मेरे पास जावा 8 के साथ एक वेब एप्लिकेशन है जिसे डब्ल्यूएएस में तैनात किया गया था और मैं इसे टोमकैट 7 में माइग्रेट कर रहा हूं।

मैंने ऐप को स्प्रिंग बूट 1.5.22 में एकीकृत किया और यह अब तक सही ढंग से काम करता है लेकिन डीबी कनेक्शन अभी भी काम नहीं करता है। मैं इसे OJDBC6.jar . का उपयोग करके oracle 10g से जोड़ना चाहता हूं

डीबी विन्यास वर्ग में मेरे पास यह कोड है:

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;
    }   }

ऐप के web.xml में मैंने इसे जोड़ा:

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

और मैंने बाहरी टॉमकैट वेब.एक्सएमएल में एक ही कोड जोड़ा;

Server.xml में मैंने इसे इसके तहत जोड़ा:

<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" />

और संदर्भ.एक्सएमएल में मैंने इसे जोड़ा:

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

लेकिन मुझे हमेशा यह त्रुटि मिलती है:

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

जेएनडीआई नाम इस संदर्भ से संबंधित नहीं है मैं जिस संस्करण का उपयोग कर रहा हूं उसके रूप में मैंने आधिकारिक टॉमकैट 7.0.108 दस्तावेज का पालन किया; फिर मैंने डीबी कॉन्फ़िगरेशन क्लास को इस तरह बदल दिया:

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

मैंने अपने ऐप के अंदर /src/main/webapp/META-INF में एक संदर्भ.xml बनाया और यह कोड जोड़ा:

<?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!!

यहां तक ​​कि app.properties में संपत्ति spring.datasource.jndi-name ने भी समस्या का समाधान नहीं किया:/

यहाँ मेरी कुछ मावेन निर्भरताएँ हैं:

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

यहाँ टॉमकैट में कंसोल आउटपुट की अंतिम पंक्ति है:

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)

यहां कंट्रोलरकनेक्शन क्लास है:

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);
    }
}

मैं वास्तव में ढेर हूँ !! क्या किसी को भी यही समस्या थी कृपया??????

1
Manel BEN AMARA 14 अगस्त 2021, 19:47

2 जवाब

सबसे बढ़िया उत्तर

हल किया! समस्या यह है कि मैं ojdbc ड्राइवर के गलत संस्करण का उपयोग कर रहा था! ojdbc6-11.1.0.7.0.jar ने समस्या का समाधान किया

0
Manel BEN AMARA 29 अगस्त 2021, 15:20

JNDI नामकरण परंपरा का पालन करना बेहतर होगा।

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

तो जावा पर कुछ ऐसा:

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

Resource global= विशेषता कम से कम jdbc से शुरू होनी चाहिए।
टॉमकैट 7 दस्तावेज़ jdbc JDNI या < पर a href="https://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories" rel="nofollow noreferrer">कस्टम संसाधन फैक्ट्रियों को जोड़ना अगर आपको अपने JDNI की आवश्यकता है rnz_fta से शुरू होने वाला नाम।

1
LMC 14 अगस्त 2021, 23:03