2012-04-29 22 views
7

私は次のように実行するとき:ここでjavax.naming.NamingExceptionが発生するのはなぜですか?

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 

私はこの例外の理由を知らない、とデータベースに接続するために必要なすべての他のサーブレットURL java:comp/env/jdbc/photogはうまく動作します。

+0

この接続が機能するサーブレットのコードを投稿できますか? –

+0

@ Bhargavaはなぜそれが必要ですか? –

+0

さて、私はこの2つの間にいくつかの違いがあることを見て、なぜこの場合にはうまくいかないのかを説明したいと思っていました。 –

答えて

12

stacktraceは、Glassfishを使用していることを示しています。 java:comp/env/の部分を削除します。すでにデフォルトのJNDIコンテキストルートです。 Tomcatでのみ明示的に指定する必要があります。また、Webアプリケーションのコンテキストでこれを呼び出す必要があります。普通のJavaアプリケーションではなく、main()です。具体的な問題への無関係


、あなたは本当にDataSource毎回を取得する必要がありますか?ヘルパークラスを作成して、webappの起動時または静的初期化子で1回だけ取得します。アプリケーションの幅広くスレッドセーフです。 Connectionだけを実際に取得する必要があります(クローズしていないので、DBリソースが漏れています)ので、SQLクエリーを起動する必要があります。

+2

Tomcatだけで 'java:comp/env'の部分が必要なのはなぜですか?私はそれを難し​​い方法と考えました。 – asgs

+1

@asgs:いいえ。 Tomcatの人たちはそれを決めました。とにかくTomcatは完全なJava EEコンテナではありません。 – BalusC

+0

BalusC OK、 'DataSource'のヒントをありがとうございます。 – asgs

関連する問題