कुख्यात java.sql.SQLException: कोई उपयुक्त ड्राइवर नहीं मिला


89

मैं एक मौजूदा Tomcat 5.5 एप्लिकेशन (GeoServer 2.0.0, अगर वह मदद करता है) के लिए एक डेटाबेस-सक्षम JSP को जोड़ने का प्रयास कर रहा हूं।

एप्लिकेशन खुद ही पोस्टग्रेज्स से बात करता है बस ठीक है, इसलिए मुझे पता है कि डेटाबेस ऊपर है, उपयोगकर्ता इसे एक्सेस कर सकता है, वह सब अच्छा सामान। मैं जो करने की कोशिश कर रहा हूं वह एक जेएसपी में एक डेटाबेस क्वेरी है जिसे मैंने जोड़ा है। मैं टॉमकैट डेटा स्रोत उदाहरण में बहुत बॉक्स से बाहर विन्यास उदाहरण का उपयोग किया है । अपेक्षित टैगलिब सही जगह पर हैं - कोई त्रुटि नहीं होती है अगर मेरे पास सिर्फ टैगलिब रेफ है, तो यह उन JAR को ढूंढ रहा है। पोस्टग्रैड्स jdbc ड्राइवर, postgresql-8.4.701.jdbc3.jar $ CATALINA_HOME / common / lib में है।

यहाँ JSP का शीर्ष है:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/mmas">
  select current_validstart as ValidTime from runoff_forecast_valid_time
</sql:query>

$ CATALINA_HOME / conf / server.xml से संबंधित अनुभाग, <Host>जिसके अंदर बारी है <Engine>:

<Context path="/gs2" allowLinking="true">
  <Resource name="jdbc/mmas" type="javax.sql.Datasource"
      auth="Container" driverClassName="org.postgresql.Driver"
      maxActive="100" maxIdle="30" maxWait="10000"
      username="mmas" password="very_secure_yess_precious!"
      url="jdbc:postgresql//localhost:5432/mmas" />
</Context>

ये लाइनें webapps / gs2 / WEB-INF / web.xml में टैग में अंतिम हैं:

<resource-ref>
  <description>
     The database resource for the MMAS PostGIS database
  </description>
  <res-ref-name>
     jdbc/mmas
  </res-ref-name>
  <res-type>
     javax.sql.DataSource
  </res-type>
  <res-auth>
     Container
  </res-auth>
</resource-ref>

अंत में, अपवाद:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]

मेरा उत्तर देखें: stackoverflow.com/a/38656446/632951
पचेरियर

जवाबों:


106

कुख्यात java.sql.SQLException: कोई उपयुक्त ड्राइवर नहीं मिला

इस अपवाद के मूल रूप से दो कारण हो सकते हैं :

1. JDBC ड्राइवर लोड नहीं है

आपको यह सुनिश्चित करने की आवश्यकता है कि JDBC ड्राइवर को सर्वर के अपने /libफ़ोल्डर में रखा गया है ।

या, जब आप वास्तव में एक सर्वर-प्रबंधित कनेक्शन पूल डेटा स्रोत का उपयोग नहीं कर रहे हैं, लेकिन मैन्युअल रूप DriverManager#getConnection()से WAR में चारों ओर फ़िदेलिंग कर रहे हैं , तो आपको WD में JDBC ड्राइवर को रखने /WEB-INF/libऔर प्रदर्शन करने की आवश्यकता है।

Class.forName("com.example.jdbc.Driver");

.. पहली कॉल से पहले अपने कोड में , DriverManager#getConnection()जिससे आप यह सुनिश्चित कर लें कि आप इसे निगल नहींClassNotFoundException सकते / अनदेखा नहीं करेंगे, जो इसके द्वारा फेंका जा सकता है और कोड प्रवाह जारी रख सकता है जैसे कि कुछ भी असाधारण नहीं हुआ। यह भी देखें कि मुझे टॉमकैट के कनेक्शन पूल के लिए जेडीबीसी ड्राइवर को कहां रखना है?

2. या, JDBC URL गलत सिंटैक्स में है

आपको यह सुनिश्चित करने की आवश्यकता है कि JDBC URL JDBC ड्राइवर प्रलेखन के अनुरूप है और ध्यान रखें कि यह आमतौर पर संवेदनशील होता है। JDBC यूआरएल वापस नहीं करता है जब trueके लिए Driver#acceptsURL()भरी हुई ड्राइवरों में से किसी के लिए है, तो आप भी वास्तव में इस अपवाद मिल जाएगा।

PostgreSQL के मामले में यह यहाँ प्रलेखित है

JDBC के साथ, एक डेटाबेस एक URL (यूनिफ़ॉर्म रिसोर्स लोकेटर) द्वारा दर्शाया जाता है। PostgreSQL ™ के साथ, यह निम्न रूपों में से एक लेता है:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

MySQL के मामले में यह यहाँ प्रलेखित है

MySQL सर्वर से कनेक्ट करने के लिए JDBC URL के लिए सामान्य प्रारूप निम्नानुसार है, जिसमें वर्ग कोष्ठक ( [ ]) में आइटम वैकल्पिक हैं:

jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

ओरेकल के मामले में यह यहाँ प्रलेखित है

2 URL सिंटैक्स, पुराने सिंटैक्स हैं जो केवल SID के साथ काम करेंगे और नया Oracle सेवा नाम के साथ होगा।

पुराना वाक्य-विन्यास jdbc:oracle:thin:@[HOST][:PORT]:SID

नया वाक्यविन्यास jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


यह सभी देखें:


धन्यवाद दोस्तों! क्षमा करें पहला प्रयास ओपी में नहीं था, बस jdbc: postgresql: mmas (और मैंने दूसरों की कोशिश की!)। अफसोस की बात है, araqnid के URL के साथ, वही परिणाम। कल रात मैंने जावा (एम्बेडेड) के लिए टैलिब का सामान स्वैप किया, और यह ठीक काम करता है: कोशिश करें {Class.forName ("org.postgresql.Driver")। newInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("चयन यदा यदा"); if (rs! = null && rs.next ()) {// रिप फेम, भाग्य, वैभव, लड़कियां जकार्ता उदाहरण w / taglibs था, इसलिए मैंने इस तरह से शुरुआत की।
रिक वेन

आह। टिप्पणियाँ इतनी w / कोड स्वरूपण नहीं। अहम। क्या मेरा नौसिखिया दिखा रहा है? (ZIIP!) वैसे भी, जकार्ता उदाहरण सभी के बारे में था <sql: query> सिंटैक्स का उपयोग सिर्फ जावा कोड को एम्बेड करने के बजाय, और मैं मानता हूं कि इसे करने के लिए बहुत अधिक क्लीनर तरीका है। एक को स्पष्ट रूप से forName () और getConnection (), सही कॉल करने की आवश्यकता नहीं होनी चाहिए? लेकिन पुराने बदसूरत हैक-द-ड्राइवर-इन-प्रेजेंटेशन-ऑफ-प्रेजेंट-लेयर विधि ने ठीक काम किया, पहले प्रयास करें। तो मैं चकरा गया, लेकिन अब यह "यह टूट गया है, इसे ठीक करें या अपने बर्गर-फ़्लिपिंग कौशल पर ब्रश करें" की तुलना में रखरखाव / सौंदर्यशास्त्र मुद्दे का अधिक है।
रिक वेन

एससीएचओ एसक्यूएल टैगलिब का उपयोग केवल स्क्रिप्ट में जेडीबीसी करने से थोड़ा बेहतर है ... बहुत नियंत्रक / दृश्य पैटर्न पसंद करते हैं जहां डीबी सामान ऊपर किया जाता है और जेएसपी सिर्फ सामान प्रदर्शित करता है। प्रत्येक अपने स्वयं के हालांकि, और sql का उपयोग करने के लिए: क्वेरी चीजों को सरल रखता है :) (ish)
araqnid

मैंने कभी नहीं कहा कि मैं JSTL SQL टैगलिब का उपयोग करने से सहमत हूं, लेकिन यह विषय नहीं है जहां यह विषय है।
बालुसक

2
धन्यवाद, आपका JDBC कनेक्शन स्ट्रिंग प्रारूप बेहद मददगार थे!
जे टेलर

15
url="jdbc:postgresql//localhost:5432/mmas"

वह URL गलत लग रहा है, क्या आपको निम्न की आवश्यकता है?

url="jdbc:postgresql://localhost:5432/mmas"

15

मैं अपने प्रोजेक्ट ( Mvnrepository ) में PostgreSQL JDBC ड्राइवर जोड़ना भूल गया हूँ ।

ग्रेडेल :

// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'

मावेन :

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.0-801.jdbc4</version>
</dependency>

आप यह भी कर सकते हैं डाउनलोड जार मैन्युअल रूप से और अपनी परियोजना के लिए आयात।


12

मैंने इसी तरह के मुद्दे का सामना किया। मेरे प्रोजेक्ट का संदर्भ डायनेमिक वेब प्रोजेक्ट (Java 8 + Tomcat 8) है और त्रुटि PostgreSQL ड्राइवर अपवाद के लिए है: कोई उपयुक्त ड्राइवर नहीं मिला

यह Class.forName("org.postgresql.Driver")कॉलिंग getConnection()विधि से पहले जोड़कर हल हो गया

यहाँ मेरा नमूना कोड है:

try {
            Connection conn = null;
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode="
                    + sql_auth,sql_user , sql_password);
        } catch (Exception e) {
            System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage());
        }

3

मुझे टॉमकैट में इस मुद्दे को खत्म करने के लिए फॉलोइंग टिप मददगार लगी -

पहले ड्राइवर को लोड करना सुनिश्चित करें। एक Class.forName ("org.postgresql.Driver"); आपके कोड में

यह पोस्ट से है - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Jdbc कोड ने एक स्वसंपूर्ण कार्यक्रम के रूप में ठीक काम किया लेकिन, TOMCAT में इसने त्रुटि दी-'


कृपया कोई लिंक केवल उत्तर नहीं दें - संक्षेप में वर्णन करें कि उसके पीछे क्या है!
मोनमोना

किसी समाधान के लिए लिंक का स्वागत है, लेकिन कृपया सुनिश्चित करें कि आपका उत्तर इसके बिना उपयोगी है: लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है, तो पृष्ठ के सबसे प्रासंगिक भाग को उद्धृत करें ' मामले में लक्ष्य पृष्ठ अनुपलब्ध होने पर पुनः लिंक करना। ऐसे लिंक जो किसी लिंक से बहुत कम हैं उन्हें हटाया जा सकता है
पीटर

1

यह ध्यान देने योग्य हो सकता है कि यह तब भी हो सकता है जब विंडोज डाउनलोड करता है कि वह असुरक्षित मानता है। इसे जार फ़ाइल (जैसे ojdbc7.jar) पर राइट-क्लिक करके और नीचे स्थित 'अनब्लॉक' बॉक्स को चेक करके संबोधित किया जा सकता है।

विंडोज जार फ़ाइल गुण संवाद :
विंडोज जार फ़ाइल गुण संवाद


1

MySQL JDBC कनेक्टर को जोड़ने के साथ ही आपके DB कनेक्शन परिभाषाओं में Tomcats conf डायरेक्टरी के साथ संदर्भ .xml (यदि टॉमकैट वेबैप फ़ोल्डर में अनपैक नहीं किया गया है) सुनिश्चित करें।


1

एक बहुत ही मूर्खतापूर्ण गलती जो संभव हो सकती है परिणामस्वरूप JDBC URL कनेक्शन की शुरुआत में स्थान जोड़ रही है।

मेरा कहने का तात्पर्य है:-

मान लीजिए कि आपने bydistake को jdbc url की तरह दिया है

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(ध्यान दें कि url को घूरने में एक जगह है, यह त्रुटि करेगा)

सही तरीका होना चाहिए:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(घूर में कोई जगह न देखें, आप url के अंत में जगह दे सकते हैं लेकिन यह सुरक्षित नहीं है)


0

मैं jruby का उपयोग कर रहा था, मेरे मामले में मैंने config / initializers के तहत बनाया था

postgres_driver.rb

$CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar'

या जहां भी आपका ड्राइवर है, और यह बात है!


0

एसटीएस में स्प्रिंग बूट एप्लिकेशन को विकसित करते समय मेरे पास यह सटीक मुद्दा था, लेकिन अंततः पैक किए गए युद्ध को वेबस्फेयर (v.9) में तैनात किया। पिछले उत्तरों के आधार पर मेरी स्थिति अद्वितीय थी। ojdbc8.jar मेरे WEB-INF / lib फ़ोल्डर में पेरेंट लास्ट क्लास लोडिंग सेट के साथ था, लेकिन हमेशा यह कहता है कि यह उपयुक्त ड्राइवर को खोजने में विफल रहा।

मेरा अंतिम मुद्दा यह था कि मैं गलत डेटा स्रोत वर्ग का उपयोग कर रहा था क्योंकि मैं केवल ऑनलाइन ट्यूटोरियल / उदाहरणों के साथ अनुसरण कर रहा था। डेविड दाई को अपने ही सवाल पर टिप्पणी के लिए संकेत मिला: स्प्रिंग JDBC को JDBC ड्राइवर वर्ग [oracle.jdbc.driver.OracleDriver] लोड नहीं कर सका

ओरेकल विशिष्ट ड्राइवर के साथ बाद में स्प्रिंग गुरु उदाहरण भी मिला: https://springframework.guru/configuring-spring-boot-for-oracle/

उदाहरण जो org.springframework.jdbc.datasource.DriverManagerDataSourceसामान्य उदाहरणों के आधार पर त्रुटि का उपयोग करता है ।

@Config
@EnableTransactionManagement
public class appDataConfig {
 \* Other Bean Defs *\
    @Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password");
        dataSource.setSchema("MY_SCHEMA");
        return dataSource;
    }
}

और एक का उपयोग कर सही exapmle oracle.jdbc.pool.OracleDataSource:

@Config
@EnableTransactionManagement
public class appDataConfig {
/* Other Bean Defs */
@Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        OracleDataSource datasource = null;
        try {
            datasource = new OracleDataSource();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID");
        datasource.setUser("user");
        datasource.setPassword("password");

        return datasource;
    }
}

0

मैं वसंत डेटा का उपयोग करते हुए mysql डेटा स्रोत के साथ एक ही मुद्दा रहा था जो कि बाहर काम करेगा लेकिन मुझे यह त्रुटि तब दी गई जब टॉमकैट पर तैनात किया गया।

त्रुटि तब चली गई जब मैंने ड्राइवर jar mysql-कनेक्टर-java-8.0.16.jar को jres lib / ext फ़ोल्डर में जोड़ा

हालांकि मैं अन्य अनुप्रयोगों के साथ हस्तक्षेप करने के डर से उत्पादन में ऐसा नहीं करना चाहता था। चालक वर्ग को परिभाषित करने की व्याख्या ने मेरे लिए इस मुद्दे को हल कर दिया

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

0

ड्राइवर की JAR फ़ाइल की ओर इशारा करते हुए पर्यावरण चर के javaसाथ चलाएँ CLASSPATH, जैसे

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

drivers/mssql-jdbc-6.2.1.jre8.jarड्राइवर फ़ाइल के लिए रास्ता कहाँ है (उदाहरण के लिए SQL सर्वर के लिए JDBC )।

ConnectURLकि ड्राइवर (से नमूना अनुप्रयोग है samples/connections/ConnectURL.java), के माध्यम से संकलित javac ConnectURL.java


0

मेरे मामले में मैं मावेन के साथ एक जावा परियोजना पर काम कर रहा था और इस त्रुटि का सामना किया। अपनी pom.xml फ़ाइल में सुनिश्चित करें कि आपके पास यह निर्भरता है

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
  </dependencies>

और जहां आप कनेक्शन बनाते हैं, उसके पास कुछ ऐसा है

public Connection createConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
            String username = "root"; //your my sql username here
            String password = "1234"; //your mysql password here

            Class.forName("com.mysql.cj.jdbc.Driver");
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

आपको कॉल करने की आवश्यकता नहीं है Class.forNameDriverManagerइसे खोजने में सक्षम होना चाहिए।
स्टीफन सी

आप शायद सही हो सकते हैं। जावा मेरी मुख्य कोडिंग भाषा नहीं है।
जस्टिस ब्रिंगर

0

अगर आपके ऐप के लिए कहीं संसाधन की परिभाषा नहीं दी गई है, तो आपको यह वही त्रुटि मिलेगी - जो केंद्रीय संदर्भ में सबसे अधिक संभावना है। xml, या गोपनीय / कैटालिना / लोकलहोस्ट में व्यक्तिगत संदर्भ फ़ाइल। और अलग-अलग संदर्भ फ़ाइलों का उपयोग करता है, तो, सावधान रहना है कि बिलाव स्वतंत्र रूप से हटा देता है उन्हें किसी भी समय आप निकालना / इसी .war फ़ाइल undeploy।


0

यह धागा कितना भी पुराना क्यों न हो, लोग इस मुद्दे का सामना करते रहेंगे।

मेरा मामला: मेरे पास नवीनतम (पोस्टिंग के समय) OpenJDK और मावेन सेटअप है। मैंने ऊपर दिए गए सभी तरीकों की कोशिश की थी, स्टैकऑवरफ्लो पर बहन के पदों पर मावेन और यहां तक ​​कि समाधान के साथ। मैं किसी भी आईडीई या किसी अन्य चीज का उपयोग नहीं कर रहा हूं, केवल मुख्य तर्क को प्रदर्शित करने के लिए नंगे सीएलआई से चल रहा हूं।

यहाँ क्या अंत में काम किया है।

  • आधिकारिक साइट से ड्राइवर डाउनलोड करें। (मेरे लिए यह MySQL https://www.mysql.com/products/connector/ ) था। यहां अपने स्वाद का उपयोग करें।
  • दिए गए जार फ़ाइल को अपने जावा प्रोजेक्ट के समान निर्देशिका में अनज़िप करें। आपको इस तरह एक डायरेक्टरी स्ट्रक्चर मिलेगा। यदि आप ध्यान से देखें, तो यह ठीक उसी प्रकार से संबंधित है जिसे हम प्रयोग करने की कोशिश करते हैं Class.forName(....)। फ़ाइल जो हम चाहते हैं वह हैcom/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • कोड युक्त जावा प्रोग्राम को संकलित करें।
javac App.java
  • अब निर्देशक को एक मॉड्यूल के रूप में लोड करके चलाएं
java --module-path com/mysql/jdbc -cp ./ App

यह मैन्युअल रूप से (निकाले गए) पैकेज को लोड करेगा, और आपके जावा प्रोग्राम को आवश्यक ड्राइवर वर्ग मिलेगा।


  • ध्यान दें कि यह mysqlड्राइवर के लिए किया गया था , अन्य ड्राइवरों को मामूली बदलाव की आवश्यकता हो सकती है।
  • यदि आपका विक्रेता एक .debछवि प्रदान करता है , तो आप जार प्राप्त कर सकते हैं/usr/share/java/your-vendor-file-here.jar

-1

मैंने src/main/resourcesगलत तरीके से XML फ़ाइल डालकर इस समस्या का सामना किया , मैंने इसे हटा दिया और फिर वापस सामान्य हो गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.