我要做的是在一段时间后更新我的数据库。所以我正在使用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();
}
}
答案 0 :(得分:3)
此错误表明您的 jdbc 资源未注册!您在哪里放置了context.xml
?
context.xml
文件必须位于war文件的META-INF
目录中。它不能位于 classes目录或 jar 文件中。
将META-INF
目录与context.xml
放在源文件夹树中包含 webapp 的 root 的目录中。
答案 1 :(得分:1)
我有同样的问题拖延了两个痛苦的日子。我重新阅读有关JNDI的tomcat文档,确认了我的所有server.xml
,context.xml
,web.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
希望这可以解决您的问题。美好的一天!