2012-04-29 22 views
7

जब मैं निम्नलिखित चलाएँ:javax.naming क्यों नामकरण अपवाद होता है?

package NonServletFiles; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.sql.DataSource; 
import javax.naming.*; 

public class GetTagsFromDatabase { 

public GetTagsFromDatabase() { 

} 

public String[] getTags() { 

    String tags[] = null; 
    try { 
     Context context = new InitialContext(); 
     DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); // <<----- line 23 
     Connection connection = ds.getConnection(); 
     String sqlQuery = "select NAMEOFTHETAG from tagcollection"; 
     PreparedStatement statement = connection.prepareStatement(sqlQuery); 
     ResultSet set = statement.executeQuery(); 

     int i = 0; 
     while(set.next()) { 
      tags[i] = set.getString("NameOfTheTag"); 
      System.out.println(tags[i]); 
      i++; 
     } 
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 

    return tags; 
} 

public static void main(String args[]) { 
    new GetTagsFromDatabase().getTags(); // <<----- line 43 
} 
} 

मैं निम्नलिखित अपवादों:

javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/photog' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ] 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
at javax.naming.InitialContext.lookup(InitialContext.java:411) 
at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:23) 
at NonServletFiles.GetTagsFromDatabase.main(GetTagsFromDatabase.java:43) 

Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:873) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:742) 
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 
... 4 more 

मैं इस अपवाद के लिए कारण पता नहीं है, अन्य सभी सर्वलेट्स जरूरत है कि के साथ डेटाबेस से कनेक्ट करने के लिए यूआरएल java:comp/env/jdbc/photog ठीक काम करता है।

+0

क्या आप एक सर्वलेट का कोड पोस्ट कर सकते हैं जिसके लिए यह कनेक्शन काम करता है? –

+0

@ प्रवेश भार्गव आपको इसकी आवश्यकता क्यों है? –

+0

खैर, मैं उन दोनों के बीच कुछ अंतर खोजने की उम्मीद कर रहा था जो बताएंगे कि यह इस मामले में क्यों काम नहीं करता है। –

उत्तर

12

स्टैकट्रैक संकेत देता है कि आप ग्लासफ़िश का उपयोग कर रहे हैं। java:comp/env/ भाग हटाएं। यह पहले से ही डिफ़ॉल्ट जेएनडीआई संदर्भ रूट है। केवल टॉमकैट में आपको इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। साथ ही, आपको इसे वेबैप संदर्भ में आमंत्रित करना चाहिए, न कि main() के साथ एक सादे जावा एप्लिकेशन के रूप में।


असंबंधित ठोस समस्या के लिए, तुम सच में DataSourceहर पाने के लिए की जरूरत है? मैं एक सहायक वर्ग बनाउंगा जो इसे वेबपैप के स्टार्टअप पर या एक स्थिर प्रारंभकर्ता में केवल एक बार प्राप्त करता है। यह आवेदन चौड़ा और थ्रेडसेफ है। केवल Connection को वास्तव में प्राप्त करने की आवश्यकता है (और बंद! आप इसे बंद नहीं कर रहे हैं, इसलिए आप डीबी संसाधनों को लीक कर रहे हैं) हर बार जब आपको SQL क्वेरी को आग लगाना पड़ता है।

+2

टोमकैट को अकेले 'जावा: कंप/एनवी' भाग की आवश्यकता क्यों है? मैंने इसे कठिन तरीका बताया। – asgs

+1

@asgs: कोई विचार नहीं। टॉमकैट लोगों ने ऐसा फैसला किया। टोमकैट वैसे भी एक पूर्ण जावा ईई कंटेनर नहीं है। – BalusC

+0

बलससी ओके, 'डेटासोर्स' पर टिप के लिए धन्यवाद। – asgs