2012-04-29 14 views
7

quando ho eseguito il seguente:perché javax.naming.NamingException si verifica qui?

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

che ricevo le seguenti eccezioni:

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 

non so il motivo di questa eccezione, tutti gli altri servlet che hanno bisogno di connettersi al database con l'url java:comp/env/jdbc/photog funziona bene.

+0

Potrebbe pubblicare il codice di un servlet per il quale funziona questa connessione? –

+0

@Amit Bhargava perché ne hai bisogno? –

+0

Beh, speravo di trovare alcune differenze tra i due che spiegassero perché non funziona in questo caso. –

risposta

12

Lo stacktrace indica che si sta utilizzando Glassfish. Rimuovere la parte java:comp/env/. È già la root di contesto JNDI predefinita. Solo in Tomcat è necessario specificarlo esplicitamente. Inoltre, dovresti invocarlo nel contesto webapp, non come semplice applicazione Java con main().


Estranei al problema concreto, non si ha realmente bisogno per ottenere il DataSourceogni? Creo una classe helper che la ottiene solo una volta all'avvio di webapp o in un inizializzatore statico. È un'applicazione ampia e sicura. Solo il numero Connection deve essere effettivamente ottenuto (e chiuso! Non lo stai chiudendo, quindi stai perdendo risorse DB) ogni volta che devi attivare una query SQL.

+2

Perché Tomcat da solo ha bisogno della parte 'java: comp/env'? L'ho pensato nel modo più duro. – asgs

+1

@asgs: non ne ho idea. Tomcat ragazzi l'hanno deciso così. Tomcat non è comunque un contenitore Java EE completo. – BalusC

+0

BalusC OK, grazie per il suggerimento su 'DataSource'. – asgs

Problemi correlati