web-dev-qa-db-ja.com

javax.naming.NameNotFoundException:名前[comp / env]はこのコンテキストにバインドされていません。 Javaスケジューラーで[comp]エラーを見つけることができません

私がやろうとしていることは、一定期間後にデータベースを更新することです。 Java=スケジューラと接続プーリングを使用しています。理由はわかりませんが、コードは1回しか機能しません。次のように出力されます。

init success
success
javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:820)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:168)
    at org.Apache.naming.SelectorContext.lookup(SelectorContext.Java:158)
    at javax.naming.InitialContext.lookup(InitialContext.Java:411)
    at test.Pool.main(Pool.Java:25)  ---> line 25 is Context envContext = (Context)initialContext.lookup("Java:/comp/env");

なぜ一度しか機能しないのかわかりません。 Javaスケジューラなしで実行しなかった場合は既にテストしましたが、正常に動作します。エラーは発生しません。スケジューラを使用して実行した場合、このエラーが発生する理由がわかりません。

誰かが私を助けてくれることを願っています。

私の接続プーリングコード

public class Pool {
public DataSource main() {
    try {
        InitialContext initialContext = new InitialContext();
        Context envContext = (Context)initialContext.lookup("Java:/comp/env");
        DataSource datasource = new DataSource();   
        datasource = (DataSource)envContext.lookup("jdbc/test");
        return datasource;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

}

my web.xml

<web-app version="3.0" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
    <listener-class> package.test.Pool</listener-class>
</listener>
<resource-ref>
    <description>DB Connection Pooling</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Context.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<Context path="/project" reloadable="true">
  <Resource auth="Container" 
            defaultReadOnly="false" 
            driverClassName="com.mysql.jdbc.Driver" 
            factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory" 
            initialSize="0" 
            jdbcInterceptors="org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer" 
            jmxEnabled="true" 
            logAbandoned="true" 
            maxActive="300" maxIdle="50"
            maxWait="10000" 
            minEvictableIdleTimeMillis="300000"
            minIdle="30" 
            name="jdbc/test"
            password="test" 
            removeAbandoned="true"
            removeAbandonedTimeout="60" 
            testOnBorrow="true"
            testOnReturn="false" 
            testWhileIdle="true" 
            timeBetweenEvictionRunsMillis="30000"
            type="javax.sql.DataSource" 
            url="jdbc:mysql://localhost:3306/database?noAccessToProcedureBodies=true" 
            username="root"
            validationInterval="30000" 
            validationQuery="SELECT 1"/>
</Context>

my Javaスケジューラー

public class Scheduler extends HttpServlet{

public void init() throws ServletException
{
    System.out.println("init success");
    try{
        Scheduling_test test = new Scheduling_test();
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(100);
        ScheduledFuture future = executor.scheduleWithFixedDelay(test, 1, 60 ,TimeUnit.SECONDS);
    }catch(Exception e){
         e.printStackTrace();
    }
}

}

Schedule_test

    public class Scheduling_test extends Thread implements Runnable{
    public void run(){
        Updating updating = new Updating();
        updating.run();
    }
}

更新中

public class Updating{

        public void run(){
            ResultSet rs = null;
            PreparedStatement  p = null;
            StringBuilder sb = new StringBuilder();
            Pool pool = new Pool();
            Connection con = null; 
            DataSource datasource = null;
            try{
                datasource = pool.main();
                con=datasource.getConnection();
                sb.append("SELECT * FROM database");
                p = con.prepareStatement(sb.toString());
                rs = p.executeQuery();
                rs.close();
                con.close();
                p.close();
                datasource.close();
                System.out.println("success");
         }catch (Exception e){
                e.printStackTrace();
         }
    }
8
Morgan Azhari

このエラーは、あなたのjdbcリソースが未登録であることを示しています! context.xmlはどこに置きましたか?

context.xmlファイルは、warファイルのMETA-INFディレクトリにある必要があります。 classes directoryまたはjarファイルに存在してはなりません。

ソースフォルダーツリーのwebapprootを含むディレクトリに、META-INFを含むcontext.xmlディレクトリを配置します。

3
Heidarzadeh

サーバーを停止して再起動してみてください(EclipseとTomcatサーバーを使用していると思います)。最初は空だったのと同じようにコンテキストxmlファイルを作成したとき、サーバーはその内容を同期できなかったため、後でcontext.xmlファイルで指定したデータベース接続リソース名を見つけることができませんでした。

つまり、この問題をまだ解決していない場合。

1

同じ問題が2日間続きました。 JNDIに関するTomcatのドキュメントを再度読み、server.xmlcontext.xmlweb.xmlのすべての構成と、ネーミングオブジェクトにアクセスするためのコードを確認しましたが、まだ進行していません。

これは、私のプロジェクトの依存関係であり、名前付けコンテキスト(axis2)に干渉していることがわかりました。 axis2-1.6.0からaxis2-1.6.2に移動するだけで問題が発生しました。

1
Martins

同じ問題が発生しました。私の場合、Tomcat構成ファイルまたはプロジェクトには何も問題はありませんでしたが、Tomcatが実行されていたためpostgresサービスインスタンスを再起動する必要があり、どういうわけか変更が反映されて例外が消えました。問題を完全に解消するには、Windowsを再起動する必要がありました。なぜだかわかりません!

0
Bat0u89

同じモジュールの2つのバージョンが存在するの場合、この問題は可能性ありからariseへの問題です。 libフォルダで同じモジュールの複数のバージョンを確認してください。不要なバージョンを削除し、サーバーを再起動します。

私の場合はservlet-api 2つのバージョンで存在servlet-api.jarservlet-api-2.jar

これで問題が解決することを願っています。良い一日!

0
Mukundhan

そうではありません Java:/comp/env だが Java:comp/env

0
taringamberini