- - PR -
TOMCATでJDBCを使ってDBにアクセスできない
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-03-30 13:18
こちらに書き込む内容なのかどうか迷ったのですが、もし同じような境遇に見回
れた方がいらっしゃいましたら教えていただきたく書き込みした次第です。 以下の環境でTOMCATを利用しています。 ------------------------------------------------------------------- OS :linux kernel 2.4.18-1 DB : Oracle9i Enterprise Edition Release 9.2.0.1.0 TOMCAT : tomcat4-4.1.18 JAVA :java version 1.3.1_07 ------------------------------------------------------------------- TOMCATのインストールが旨く行き、8080ポートのサンプル等は表示することが できるようになりました。JDBCを経由しない簡単なJSPサンプル(※1)を作り、 TOMCAT上で表示できるのは確認しました。 ところが、JDBCを使ってデータベースにアクセスさせたところ、org.apache.jasper.JasperException(この後空白でなにもメッセージが無い) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) (以下略) となって表示されません。 TOMCATを経由しないJDBC経由のプログラムを作りDBにアクセスするプログラ ム(JDBCのTYPE2とTYPE4の両方)を作って確認したところ動作するところま では確認しました。 TOMCATのバージョンは4.1.18ですがJDNIを利用しないDriverManagerでのア クセスができない状況です。うまく行けばJDNIを試そうと考えています。 うまく行かない場合のJSPのプログラムですが、TOMCATを経由しないJAVAの プログラムを加工して作っているので文字のうち間違いいはなさそうです。 (※2) DB側(ORACLE)のリスナーのログを見ると、TOMCATを経由させた場合には DBへのアクセスが無いみたくログへの書き込みが無い状態ですのでなんとか DBへアクセスさせたいのですがいくつかのSITE(ジャバハウス等)を見てみ たのですがどうも分かりません。 そもそもエラーログが全うに出ていない状況(ADMINISTRATION TOOL)にて エラーレベルを最大にしているのですがinitされた後にすぐにエラーになる 様です。 恐らく環境設定のどこかが違うのだろうと思っていますが、CLASSPATHの設 定(例えば、"classes12.zip"を$CATALINA_HOME/common/libに置いてCLA SSPATHを通す)と言ったところまではやってみました。 JDBCのドライバはOTNからDLしたものをそのまま利用しています。インスト ール時に$ORACLE_HOME/jdbc/libにもあったのですがこのあたりは新しい 方がいいかなと思って利用しています。 もしやと思われる方がいらっしゃいましたら書き込みの程お願いいたします。 ------------------------------------------------------------------- ※1(JDBCを通さないサンプル:動作OK) ※importはご愛敬って事でお願いします。 <%@ page contentType="text/html; charset=euc-jp" %> <%@ page import = "java.sql.*" %> <HTML><BODY> <% int i; i = 0; while ( i < 10 ) { out.println(i + "<BR>"); i = i + 1; } %> </BODY></HTML> ------------------------------------------------------------------- ※2(TOMCATを利用しないJDBCの単純なサンプル:動作OK) // JDBC APIをインポート import java.sql.*;class JavaDataAccess01 { public static void main (String args[]) throws SQLException, ClassNotFoundException { // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracleに接続 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:おらくるSID", "おらくるID", "おらくるパスワード"); // ステートメントを作成 Statement stmt = conn.createStatement(); // 問合せの実行 ResultSet rset = stmt.executeQuery("SELECT ID FROM TEST"); // 問合せ結果の表示 while ( rset.next() ) { System.out.println(rset.getString(1) + "\t" ); } // 結果セットをクローズ rset.close(); // ステートメントをクローズ stmt.close(); // 接続をクローズ conn.close(); } } ------------------------------------------------------------------- ※3(JDBCの動作しないJSP:動作×) <%@ page contentType="text/html; charset=euc-jp" %> <%@ page import = "java.sql.*" %> <% // Javaデータアクセスの基礎 サンプルコード(1) // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracleに接続 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:おらくるSID", "おらくるID", "おらくるパスワード"); // ステートメントを作成 Statement stmt = conn.createStatement(); // 問合せの実行 // ORACLEの予約語を使うとエラーになるとの事でSQLを少し変更してあります。 // ※2で利用しているSQLでも動作しません。 ResultSet rset = stmt.executeQuery("SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') DD FROM DUAL"); // 問合せ結果の表示 while ( rset.next() ) { out.println("<HTML><BODY" + rset.getString(1)); } // 結果セットをクローズ rset.close(); // ステートメントをクローズ stmt.close(); // 接続をクローズ conn.close(); %> </BODY></HTML> ------------------------------------------------------------------- 長くてすみませんがよろしくお願いします。 | ||||||||||||
|
投稿日時: 2003-03-30 13:46
スタックトレースの下のほうはどうなってます? JSPはコンパイルされServletになるので、そのソースのどこでエラーが出ているのかを 示しているのではないかと思いますが。
を、
とし、うまく動作したJSPとタグの入れ子の関係を揃えたほうが 問題の切り分けがしやすいかも、です。 ※同様に、SQL文も同じものにしないと、どこでエラーになっているのか わかりにくいですよ。 | ||||||||||||
|
投稿日時: 2003-03-30 14:16
レスありがとうございます。>tommy
>うまく動作したJSPとタグの入れ子の関係を揃えたほうが >問題の切り分けがしやすいかも、です。 >※同様に、SQL文も同じものにしないと、どこでエラーになっているのか > わかりにくいですよ。 ご指摘の通り、入れ子をそろえたりSQLを同じにしないと切り分けができないですよね。 下記は指摘された2点 1)入れ子を揃える 2)SQLをSELECT ID FROM TEST としたもののJSPです。(※5) スタックトレースは以下がすべてです。(※4) よろしくお願いいたします。 ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception org.apache.jasper.JasperException at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) at javax.servlet.http.HttpServlet.service(HttpServlet.java) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530) at java.lang.Thread.run(Thread.java:479) ----+----1----+----2----+----3----+----4----+----5----+----6 root cause ----+----1----+----2----+----3----+----4----+----5----+----6 javax.servlet.ServletException at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:533) at org.apache.jsp.login8_jsp._jspService(login8_jsp.java:92) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137) at javax.servlet.http.HttpServlet.service(HttpServlet.java) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241) at javax.servlet.http.HttpServlet.service(HttpServlet.java) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530) at java.lang.Thread.run(Thread.java:479) -------------------------------------------------------------------------------- Apache Tomcat/4.1 ----+----1----+----2----+----3----+----4----+----5----+----6 ※5:修正後のJSPファイル <%@ page contentType="text/html; charset=euc-jp" %> <%@ page import = "java.sql.*" %> <HTML><BODY> <% // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracleに接続 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:おらくるSID", "おらくるID", "おらくるパスワード"); // ステートメントを作成 Statement stmt = conn.createStatement(); // 問合せの実行 ResultSet rset = stmt.executeQuery("SELECT ID FROM TEST"); // 問合せ結果の表示 while ( rset.next() ) { out.println(rset.getString(1)+"<BR>"); } // 結果セットをクローズ rset.close(); // ステートメントをクローズ stmt.close(); // 接続をクローズ conn.close(); %> </BODY></HTML> | ||||||||||||
|
投稿日時: 2003-03-30 23:01
この後、Servletを別に作ってコンパイルが無いものを作成したところ、
javax.servlet.ServletException: Servlet execution threw an exception at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at filters.ExampleFilter.doFilter(ExampleFilter.java:149) root cause java.lang.NoClassDefFoundError at oracle.jdbc.driver.OracleConnection.createDMSSensors(OracleConnection.java:642) at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:311) at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468) 以下略 となりました。該当するクラスはclasses12dms.jarでこのClassが呼び出されないのですが、 環境設定(BASH)上はCLASSPATHに設定されているのですが動作しません。 TOMCAT上にはインストール時に作成されるユーザができるのでそのユーザで良いと思ったの ですがそのユーザのSHELLにCLASSPATHを設定するだけではないのでしょうか。 たとえば、tomcat4.conf内にclasspathを設定するとか・・・。 ご存知の方がいらっしゃいましたら教えて下さい。 | ||||||||||||
|
投稿日時: 2003-03-31 23:19
原因が良く分からなかったのですが、解決しました。
どこかの環境設定だと思っていたのですが、 ----+----1----+----2----+----3----+----4----+----5----+----6 WEB-INFの下にlibフォルダを作って $CATALINA_HOME/common/lib内のjarファイルをすべて 入れれば認識されました。 設定は特にしなくてもいけました。 ----+----1----+----2----+----3----+----4----+----5----+----6 としたら動作しました。お恥ずかしい。 でもなんでなんでしょう。common/lib内のjarファイルにはCLASSPATH を通してあったのですが・・・。 | ||||||||||||
|
投稿日時: 2003-04-01 02:05
はじめまして、
解決されたようなのでご参考まで... ■ライブラリ(jar,class)の置き場所ですが、tomcat4.1系ではこんな感じです。 $CATALINA_HOME/common/lib ここには、アプリケーションのjar,classを基本的に置くべきでないようです。 $CATALINA_HOME/server/lib Tomcat4.1.xが利用するライブラリが入ってます。 $CATALINA_HOME/shared/lib Webアプリ全体で使いたいものを入れる。 (コンテキストが3つあったとしてそれら全てで使いたいライブラリ) /WEB-INF/lib Webアプリ1つで使いたいライブラリ ■CLASSPATHについて tomcat4.1.xでは、startup.shを実行すると、内部(setclasspath.sh)で CLASSPATHを設定するようです。もしかしたら、CLASSPATHの設定もいらないかも しれませんが調べてません. | ||||||||||||
1
