javax.naming.NameNotFoundException:名称[comp/env]在此上下文中未绑定.使用Java Scheduler无法找到[comp]错误 [英] javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp] error with java scheduler
问题描述
我要尝试的是在一段时间后更新数据库.所以我正在使用Java调度程序和连接池.我不知道为什么,但是我的代码只能运行一次.它将打印:
What I'm trying to do is to update my database after a period of time. So I'm using java scheduler and connection pooling. I don't know why but my code only working once. It will print:
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调度程序就没有运行它,我已经对其进行了测试,并且可以正常工作.没有错误.不知道为什么使用调度程序运行此错误.
I don't know why it only works once. I already test it if I didn't running it without java scheduler and it works fine. No error whatsoerver. Don't know why i get this error if I running it using scheduler.
希望有人可以帮助我.
我的连接池代码:
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();
}
}
推荐答案
此错误表明您的 jdbc 资源未注册 !您将 context.xml
放在哪里?
This error shows that your jdbc resource is not registered! Where did you put your context.xml
?
context.xml
文件必须位于war文件的 META-INF
目录中.它不能在 classes目录或 jar 文件中.
The context.xml
file must be in the META-INF
directory of the war file. It must not be in the classes directory or in a jar file.
将 META-INF
目录与 context.xml
放入包含 webapp root 的目录中>在您的源文件夹树中.
Put the META-INF
directory with the context.xml
in the directory containing the root of the webapp in your source folder tree.
这篇关于javax.naming.NameNotFoundException:名称[comp/env]在此上下文中未绑定.使用Java Scheduler无法找到[comp]错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!