- PR -

TOMCATでJDBCを使ってDBにアクセスできない

1
投稿者投稿内容
tokyoostric
会議室デビュー日: 2003/03/30
投稿数: 4
投稿日時: 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>
-------------------------------------------------------------------

長くてすみませんがよろしくお願いします。
tommy
会議室デビュー日: 2003/03/11
投稿数: 15
投稿日時: 2003-03-30 13:46
引用:

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)
(以下略)
となって表示されません。



スタックトレースの下のほうはどうなってます?
JSPはコンパイルされServletになるので、そのソースのどこでエラーが出ているのかを
示しているのではないかと思いますが。


引用:

<%@ page contentType="text/html; charset=euc-jp" %>
<%@ page import = "java.sql.*" %>
<%
...
// 問合せ結果の表示
while ( rset.next() ) {
out.println("<HTML><BODY" + rset.getString(1));
...
%>
</BODY></HTML>



を、

コード:
<%@ page contentType="text/html; charset=euc-jp" %>
<%@ page import = "java.sql.*" %>
<HTML><BODY>
<%
...
    // 問合せ結果の表示
    while (rset.next()) {
    out.println(rset.getString(1) + "<BR>");
...
%>
</BODY></HTML>



とし、うまく動作したJSPとタグの入れ子の関係を揃えたほうが
問題の切り分けがしやすいかも、です。
※同様に、SQL文も同じものにしないと、どこでエラーになっているのか
 わかりにくいですよ。

tokyoostric
会議室デビュー日: 2003/03/30
投稿数: 4
投稿日時: 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>

tokyoostric
会議室デビュー日: 2003/03/30
投稿数: 4
投稿日時: 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を設定するとか・・・。

ご存知の方がいらっしゃいましたら教えて下さい。
tokyoostric
会議室デビュー日: 2003/03/30
投稿数: 4
投稿日時: 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
を通してあったのですが・・・。
stoc
会議室デビュー日: 2003/03/27
投稿数: 11
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)