7

次を実行すると:

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動作します。

4

1 に答える 1

12

スタック トレースは、Glassfish を使用していることを示唆しています。部品を取り外しjava:comp/env/ます。これは、すでにデフォルトの JNDI コンテキスト ルートです。Tomcat でのみ明示的に指定する必要があります。また、これをプレーンな Java アプリケーションとしてではなく、webapp コンテキストで呼び出す必要がありますmain()


具体的な問題とは関係ありませんが、本当に everytime を取得する必要がありますDataSource ? webapp の起動時または静的初期化子で一度だけ取得するヘルパー クラスを作成します。アプリケーション全体でスレッドセーフです。SQLクエリを起動する必要があるたびに、実際に取得する必要があるだけConnectionです(そして閉じます!それを閉じていないので、DBリソースをリークしています)。

于 2012-04-29T05:29:05.740 に答える