私がやろうとしていることは、一定期間後にデータベースを更新することです。 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();
}
}
このエラーは、あなたのjdbcリソースが未登録であることを示しています! context.xml
はどこに置きましたか?
context.xml
ファイルは、warファイルのMETA-INF
ディレクトリにある必要があります。 classes directoryまたはjarファイルに存在してはなりません。
ソースフォルダーツリーのwebappのrootを含むディレクトリに、META-INF
を含むcontext.xml
ディレクトリを配置します。
サーバーを停止して再起動してみてください(EclipseとTomcatサーバーを使用していると思います)。最初は空だったのと同じようにコンテキストxmlファイルを作成したとき、サーバーはその内容を同期できなかったため、後でcontext.xmlファイルで指定したデータベース接続リソース名を見つけることができませんでした。
つまり、この問題をまだ解決していない場合。
同じ問題が2日間続きました。 JNDIに関するTomcatのドキュメントを再度読み、server.xml
、context.xml
、web.xml
のすべての構成と、ネーミングオブジェクトにアクセスするためのコードを確認しましたが、まだ進行していません。
これは、私のプロジェクトの依存関係であり、名前付けコンテキスト(axis2)に干渉していることがわかりました。 axis2-1.6.0からaxis2-1.6.2に移動するだけで問題が発生しました。
同じ問題が発生しました。私の場合、Tomcat構成ファイルまたはプロジェクトには何も問題はありませんでしたが、Tomcatが実行されていたためpostgresサービスインスタンスを再起動する必要があり、どういうわけか変更が反映されて例外が消えました。問題を完全に解消するには、Windowsを再起動する必要がありました。なぜだかわかりません!
同じモジュールの2つのバージョンが存在するの場合、この問題は可能性ありからariseへの問題です。 lib
フォルダで同じモジュールの複数のバージョンを確認してください。不要なバージョンを削除し、サーバーを再起動します。
私の場合はservlet-api
2つのバージョンで存在servlet-api.jar
servlet-api-2.jar
これで問題が解決することを願っています。良い一日!
そうではありません Java:/comp/env
だが Java:comp/env
。