2012-07-17 25 views
37

समझ में नहीं आता यह क्यों कहता है अशक्त यूआरएल और एक खाली देता है 'अपवाद में' वर्ग जब मैं डेटाबेस यूआरएल प्रदान की है ?अशक्त 'कनेक्ट URL के लिए' 'वर्ग के JDBC ड्राइवर बना सकता हूँ नहीं': मैं इस अपवाद

Tomcat का उपयोग करते समय मैं एक सर्वलेट के माध्यम से derby डेटाबेस से कनेक्ट करने का प्रयास करता हूं। जब सर्वलेट चलाने हो जाता है, मैं निम्नलिखित अपवादों मिलती है:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 

at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 

at servlets.servlet_1.doGet(servlet_1.java:23) // ---> Marked the statement in servlet 

at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.NullPointerException 
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:507) 
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:476) 
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307) 
at java.sql.DriverManager.getDriver(DriverManager.java:253) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437) 
... 24 more 

सर्वलेट:

package servlets; 

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.servlet.http.*; 
import javax.servlet.*; 
import javax.sql.DataSource; 

public class servlet_1 extends HttpServlet{ 

@Override 
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 
    try { 
     // String queryString = request.getQueryString(); 
     System.out.println("!!!!!!!!!!!!!!!!!!!"); 
     Context initContext = new InitialContext(); 
     Context envContext = (Context)initContext.lookup("java:comp/env"); 
     DataSource ds = (DataSource)envContext.lookup("jdbc/PollDatasource"); 
     Connection connection = ds.getConnection(); // -->LINE 23 
     String sqlQuery = "select * from PollResult"; 
     PreparedStatement statement = connection.prepareStatement(sqlQuery); 
     ResultSet set = statement.executeQuery(); 
     System.out.println("after the final statement"); 
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 
} 

}

यह क्या अपवाद नहीं है? मुझे यह अपवाद क्यों मिला है? web.xml में

<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource" 
driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
url="jdbc:derby://localhost:1527/poll_database;create=true" 
username="suhail" password="suhail" 
maxActive="20" maxIdle="10" maxWait="-1" /> 

और इस:

मैं बिलाव के context.xml में निम्नलिखित टैग जोड़ लिया

<resource-ref> 
<description>my connection</description> 
<res-ref-name>jdbc/PollDatasource</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 

मैं कहाँ एक गलती कर रहा हूँ?

छवि .. कि डेटाबेस यूआरएल पता चलता

enter image description here

नोट: @Bryan पेंडलटन से जवाब बाद मैं org.apache.derby.jdbc.ClientDriver के लिए ड्राइवर को बदल दिया है, लेकिन मैं एक ही अपवाद मिलता है।

+2

मुझे लगता है कि कनेक्ट यूआरएल गुम है। –

+0

@ सुहैल गुप्ता हमें प्रश्नों पर झंडे मिलते हैं जो दर्शाते हैं कि यह एक डुप्लिकेट है। कभी-कभी हम उन्हें गलत तरीके से संसाधित करते हैं। हो जाता है। हम इसे ठीक करते हैं जहां हम कर सकते हैं और हमने इसे यहां ठीक कर दिया है। अब इस मुद्दे पर टिप्पणी करने का कोई कारण नहीं है। – casperOne

+0

आपका जेडीबीसी ड्राइवर .jar फ़ाइल कहां स्थित है? –

उत्तर

25

मैं कुछ भी गलत रूप से गलत नहीं देख सकता, लेकिन शायद एक अलग दृष्टिकोण आपको इसे डीबग करने में मदद कर सकता है?

आप ग्लोबल टॉमकैट के बजाय प्रति-अनुप्रयोग-संदर्भ में अपना डेटास्रोत निर्दिष्ट करने का प्रयास कर सकते हैं।

आप इसे src/main/webapp/META-INF/context.xml बनाकर कर सकते हैं (मुझे लगता है कि आप मानक मैवेन निर्देशिका संरचना का उपयोग कर रहे हैं - यदि नहीं, तो मेटा-आईएनएफ फ़ोल्डर होना चाहिए आपकी वेब-आईएनएफ निर्देशिका का एक भाई)। META-INF/context.xml फ़ाइल की सामग्री को कुछ ऐसा दिखाई देगा:

<?xml version="1.0" encoding="UTF-8"?> 

<Context path="/myApp" docBase="myApp" 
    crossContext="true" reloadable="true" debug="1"> 

<Resource name="jdbc/PollDatasource" auth="Container" 
      type="javax.sql.DataSource" driverClassName="org.apache.derby.jdbc.ClientDriver" 
      url="jdbc:derby://localhost:1527/poll_database;create=true" 
      username="suhail" password="suhail" maxActive="20" maxIdle="10" maxWait="-1"/> 
</Context> 

जाहिर पथ और docBase अपने आवेदन की विशिष्ट विवरण से मिलान करने की आवश्यकता होगी।

इस दृष्टिकोण का उपयोग करके, आपको Tomcat की context.xml फ़ाइल में डेटा स्रोत विवरण निर्दिष्ट करने की आवश्यकता नहीं है। हालांकि, यदि आपके पास एक ही डेटाबेस से बात करने वाले कई अनुप्रयोग हैं, तो आपका दृष्टिकोण अधिक समझ में आता है।

किसी भी दर पर, इसे एक भंवर दें और देखें कि इससे कोई फर्क पड़ता है या नहीं। यह हमें आपके दृष्टिकोण के साथ क्या गलत हो रहा है के बारे में एक सुराग दे सकता है।

+0

इससे कोई फर्क पड़ता है! अब मैं जानना चाहता हूं कि 'टॉमकैट्स' context.xml में 'संसाधन' चीज़ को जोड़ने पर क्या गलत हो रहा था? –

+0

मुझे आपके tomcat के context.xml के बारे में अधिक जानकारी चाहिए। आपने संसाधन को परिभाषित किया था। – Taskmaster

+3

'पथ', 'docBase', और' डीबग 'निकालें: ये गुण इस स्थिति में कानूनी नहीं हैं। –

0

Context envContext = (Context)initContext.lookup("java:comp/env");

नहीं

: Context envContext = (Context)initContext.lookup("java:/comp/env");

+0

कि एक गलती थी! इसे संपादित करने के बाद एक ही अपवाद प्राप्त करें। संपादित करें –

+0

टॉमकैट का अपना संदर्भ.एक्सएमएल देखें: url = "connection.url", यूआरएल को संपादित करने की आवश्यकता है, अगर आपको पता नहीं है कि क्या बदल गया है, तो आप इसे देख सकते हैं: http://db.apache.org/derby /docs/10.7/devguide/rdevdvlp22102.html#rdevdvlp22102 –

+0

मैं बदल गया 'url = "jdbc: derby: poll डेटाबेस" 'लेकिन उसी अपवाद –

5

ये दो बातें मेल नहीं खाते:

driverClassName = "org.apache.derby.jdbc.EmbeddedDriver" url = "JDBC: डर्बी : // localhost: 1527/poll डेटाबेस; create = true "

यदि आप एंबेडेडड्राइवर का उपयोग कर रहे हैं, तो आपके यूआरएल में नेटवर्क सिंटैक्स नहीं होना चाहिए।

इसके विपरीत, यदि आप नेटवर्क सिंटैक्स का उपयोग कर रहे हैं, तो आपको क्लाइंट ड्रायवर का उपयोग करने की आवश्यकता है।

http://db.apache.org/derby/docs/10.8/getstart/rgsquck35368.html

+0

_ "यदि आप एंबेडेडड्राइवर का उपयोग कर रहे हैं, तो आपके यूआरएल में नेटवर्क सिंटैक्स नहीं होना चाहिए।" _ क्या आप कृपया बता सकते हैं कि _EmbeddedDriver_ –

+0

का उपयोग करते समय मुझे यूआरएल लिखना चाहिए: निम्नलिखित ट्यूटोरियल के अनुसार: http://db.apache.org /derby/papers/DerbyTut/embedded_intro.html, URL को 'jdbc: derby: poll_database; create = true' ** एम्बेडेडड्राइवर ** – Yura

0

आप केवल context.xml

<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource" 
driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
url="jdbc:derby://localhost:1527/poll_database;create=true" 
username="suhail" password="suhail" 
maxActive="20" maxIdle="10" maxWait="-1" /> 

में संसाधन निर्दिष्ट और web.xml से <resource-ref> खंड को दूर करने की कोशिश की?

एक प्रोजेक्ट में मैंने अनुभाग web.xml में कॉन्फ़िगरेशन देखा है और यह काम करता है।

यह एक शिक्षित अनुमान है, लेकिन मैं JNDI संसाधन के <resource-ref> घोषणा नामित web.xml में jdbc/PollDatasourcecontext.xml में एक ही नाम के साथ संसाधन की घोषणा को भी पार कर लगता है और web.xml में घोषणा दोनों driverClassName और url इसलिए कि संपत्तियों के लिए NPEs याद आ रही है।

+1

के मामले में दिखाना चाहिए, मैंने कोशिश की लेकिन 'javax.naming.NameNotFoundException' –

+0

' टोमकैट' संस्करण का उल्लेख नहीं किया गया है - क्या आप कृपया निर्दिष्ट कर सकते हैं कि 'टोमकैट' का कौन सा संस्करण उपयोग किया जाता है? – Yura

0

आप एक एम्बेडेड ड्राइवर का उपयोग कर रहे हैं, तो connectString सिर्फ

jdbc:derby:databaseName 

है (जैसे विकल्प whith; = सच बनाएँ; उपयोगकर्ता = xxx आदि)।

यदि आप क्लाइंट ड्राइवर का उपयोग कर रहे हैं, तो कनेक्ट स्ट्रिंग को छोड़ दिया जा सकता है, लेकिन यदि ड्राइवर बदलना कोई परिणाम नहीं देता है ... सवाल क्षमा करें, लेकिन क्या आप 100% सुनिश्चित हैं कि आपने डर्बी नेटवर्क सर्वर को शुरू किया है प्रति the Derby Tutorial?

6

कई फिक्स:

  1. उपयोग अपने परिवेश के लिए सही ड्राइवर वर्ग के नाम: अगर आप एक बाहर के प्रक्रिया डर्बी सर्वर का उपयोग कर रहे हैं, तो आप ClientDriver चाहते हैं (और derbyclient.jar उपयोग करने की आवश्यकता) , होस्टनाम और बंदरगाह, आदि। यदि आप एक प्रक्रिया में डर्बी सर्वर चाहते हैं, तो आप derby.jar, एंबेडेडड्राइवर और एक यूआरएल जो एक एम्बेडेड डेटाबेस के लिए उपयुक्त है।

  2. अपने ड्राइवर JAR फ़ाइल को केवल टॉमकैट की lib/ निर्देशिका में रखें।

  3. टॉमकैट के conf/context.xml में कुछ भी न डालें: इसके लिए वास्तव में कोई कारण नहीं है। इसके बजाय, अपने <Resource> को परिभाषित करने के लिए अपने वेबैप के META-INF/context.xml का उपयोग करें।

त्रुटि "Cannot create JDBC driver of class '' for connect URL 'null' आमतौर पर तब होता है क्योंकि JDBC ड्राइवर सही जगह में नहीं है (या भी कई स्थानों पर, बिलाव के lib/ निर्देशिका की तरह, लेकिन यह भी वेब ऐप्लिकेशन की WEB-INF/lib/ निर्देशिका में में)। कृपया सत्यापित करें कि आपके पास सही जगह पर सही ड्राइवर JAR फ़ाइल है।

+0

चालक हमेशा सही जगह पर रहा है, जो कि टॉमकैट के _lib_ फ़ोल्डर के अंदर है। –

+2

@ क्रिस्टोफर स्चल्ट्ज संसाधनों को संदर्भ/संदर्भ में क्यों रखा जाता है और मेटा-आईएनएफ मंच स्वतंत्रता नहीं है। आपके पास दिए गए सर्वर द्वारा प्रबंधित एक युद्ध और अधिक संसाधन कॉन्फ़िगरेशन और पूलिंग है। – banterCZ

+0

@banterCZ आप टॉमकैट की साइट-व्यापी 'conf/context.xml' को संशोधित किए बिना मंच स्वतंत्रता बनाए रख सकते हैं। उस फ़ाइल को संशोधित करना सबसे अच्छा है और सबसे खराब सुरक्षा सुरक्षा भेद्यता है। –

1

मेरे मामले में मैंने मेटा-आईएनएफ/context.xml के बजाय समस्या [टोमकैट]/कैटालिना/लोकलहोस्ट/[mywebapp_name] .xml संपादित करने में समस्या हल की।

2

यदि आप ग्रहण का उपयोग कर रहे हैं, तो आपको अपने ग्रहण पैकेज एक्सप्लोरर में बनाए गए सर्वर प्रोजेक्ट से context.xml को संशोधित करना चाहिए। ग्रहण में टॉमकैट का उपयोग करते समय यह केवल एक वैध है, अन्य को अनदेखा किया जाता है या

0

मुझे ओरेकल के खिलाफ टोमकैट का उपयोग करने में एक ही समस्या थी। मैं डीआईडी ​​ डिस्क पर मेटा-आईएनएफ निर्देशिका में context.xml है। हालांकि यह फ़ाइल ग्रहण परियोजना में नहीं दिख रही थी। F5 रीफ्रेश पर एक साधारण हिट और context.xml फ़ाइल दिखाई दी और ग्रहण ने इसे प्रकाशित किया। सब कुछ उस से पहले काम किया। उम्मीद है कि यह किसी की मदद करता है। ग्रहण में

कोशिश मार F5

2

क्योंकि मैं गलत मार्ग में context.xml डाल मैं इस समस्या हो रही थी:

./src/main/resources/META-INF/context.xml 

सही पथ गया था:

./src/main/webapp/META-INF/context.xml