javax.naming.NameNotFoundException:名称[comp / env]未绑定在此Context中。无法使用java调度程序找到[comp]错误

时间:2012-08-31 10:10:11

标签: java sql scheduled-tasks connection-pooling runtime-error

我要做的是在一段时间后更新我的数据库。所以我正在使用java调度程序和连接池。我不知道为什么,但我的代码只工作一次。 它会打印出来:

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

}

我的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>

我的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();
         }
    }

6 个答案:

答案 0 :(得分:3)

此错误表明您的 jdbc 资源未注册!您在哪里放置了context.xml

context.xml文件必须位于war文件的META-INF目录中。它不能位于 classes目录 jar 文件中。

META-INF目录与context.xml放在源文件夹树中包含 webapp root 的目录中。

答案 1 :(得分:1)

我有同样的问题拖延了两个痛苦的日子。我重新阅读有关JNDI的tomcat文档,确认了我的所有server.xmlcontext.xmlweb.xml配置以及访问命名对象的代码......仍然没有进展。

结果是我的项目中的依赖项干扰了命名上下文 - axis2。从axis2-1.6.0到axis2-1.6.2的简单移动引起了我的问题。

答案 2 :(得分:0)

尝试停止并重新启动服务器(我假设您使用的是Eclipse和Tomcat服务器)。也许当您创建上下文xml文件时,它最初是空的,您的服务器无法同步其内容,因此无法找到您稍后在context.xml文件中指定的数据库连接资源名称。

即。如果你还没有解决这个问题。

答案 3 :(得分:0)

它不是java:/comp/env而是java:comp/env

答案 4 :(得分:0)

我只是遇到了同样的问题。在我的情况下,tomcat配置文件或项目没有问题,但是当我的tomcat运行时,我不得不重新启动postgres服务实例,它将以某种方式获取更改,并且异常消失了。我必须重新启动Windows,才能完全解决问题。不知道为什么!

答案 5 :(得分:0)

存在同一模块的两个版本时,此问题很可能会引起。 请检查lib文件夹中同一模块的多个版本。 删除不需要的版本,然后重新启动服务器。

在我的情况下,servlet-api有两个版本servlet-api.jar servlet-api-2.jar

希望这可以解决您的问题。美好的一天!