- PR -

Oracle10gにデータソースアクセスした際、ClassNotFoundExceptionが発生してしまいます

1
投稿者投稿内容
bk
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2005-11-18 09:38
現在、業務の検証として、Windows上のTomcatにあるWebアプリケーションから
別のLinux端末にあるDBサーバにデータソースでアクセスすることを試みています。


■Webアプリケーションサーバが動いている環境
OS WindowsXP
Webアプリケーションサーバ Tomcat5.0.28
JDK 1.4
JDBCドライバ ojdbc14.jar
Eclipse3.1(WTP0.7) (ここからTomcatを起動させています。)

■データベースサーバ
OS Fedora Core 3
DB oracle10g


■質問内容
Tomcatで動作しているWebアプリケーションサーバからDBサーバに対して
データソースで接続する際に、classpathは通しているにも関わらず
JDBCドライバが見つからない現象が発生しています。

いろいろ調べた結果、同じ現象が起きている方がいて、
解決法の所に記載されていた以下の2つのことをやったのですが、
以下のエラーが発生しました。

■行なったこと1

JDBCドライバを
%CATALINA_HOME%\common\lib\ojdbc14.jar
に置いて、Tomcat起動後、DBアクセス

■行なったこと1の結果出たエラー

org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect URL 'oracle:thin://ncs45.sj.ncsoost.co.jp:1521/ncsecsite'
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at jp.co.javancs.util.DAOTemplate.createConnection(DAOTemplate.java:31)
at jp.co.javancs.ecsite.goods.BookDAO.getHitNum(BookDAO.java:175)
at jp.co.javancs.ecsite.goods.BookSearch.<init>(BookSearch.java:33)
at jp.co.javancs.ecsite.controller.SearchController.doPost(SearchController.java:53)
at jp.co.javancs.ecsite.controller.SearchController.doGet(SearchController.java:18)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at jp.co.javancs.ecsite.controller.BookShopController.doPost(BookShopController.java:127)
at jp.co.javancs.ecsite.controller.BookShopController.doGet(BookShopController.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:670)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:637)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:43)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at jp.co.javancs.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(Unknown Source)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
... 60 more

■行なったこと2
JDBCドライバ%CATALINA_HOME%\common\lib\ojdbc14.jar
に置いてあったものを削除し、今度はWebApplicationRoot/WEB-INF/lib/ojdbc14.jarに置いて、
Tomcat起動後、DBアクセス(念のためclasspathも通しています。)

■行なったこと2の結果出たエラー

org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at jp.co.javancs.util.DAOTemplate.createConnection(DAOTemplate.java:31)
at jp.co.javancs.ecsite.goods.BookDAO.getHitNum(BookDAO.java:175)
at jp.co.javancs.ecsite.goods.BookSearch.<init>(BookSearch.java:33)
at jp.co.javancs.ecsite.controller.SearchController.doPost(SearchController.java:53)
at jp.co.javancs.ecsite.controller.SearchController.doGet(SearchController.java:18)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at jp.co.javancs.ecsite.controller.BookShopController.doPost(BookShopController.java:127)
at jp.co.javancs.ecsite.controller.BookShopController.doGet(BookShopController.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:670)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:637)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:43)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at jp.co.javancs.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:854)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:721)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:760)
... 60 more


■エラーの要約
%CATALINA_HOME%\common\lib\ojdbc14.jarにおいた場合は、
Caused by: java.sql.SQLException: No suitable driver
が発生し、
WebApplicationRoot/WEB-INF/lib/ojdbc14.jarにおいて、
classpathを通した場合は、
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
が発生しました。

特に後者の現象が納得いきません。


■DBアクセスソースコード(関係部分のみ)
public Connection createConnection() throws SQLException{
Connection con = null;
try {
// 初期コンテキストを取得
InitialContext ic = new InitialContext();
// ルックアップしてデータソースを取得
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/bbshop");
con = ds.getConnection(); //★デバッグするとここで例外発生
} catch (Exception e) {
e.printStackTrace();
}
return con;
}

■server.xml(関係部分のみ)
<Context path="/ncsecsite" docBase="・・・・" debug="0" reloadable="true">
<Resource name="jdbc/bbshop" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/bbshop">
<parameter>
<name>username</name>
<value>ncs</value>
</parameter>
<parameter>
<name>password</name>
<value>ncsoost</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>←★oracle.jdbc.OracleDriverとしても同様でした
</parameter>
<parameter>
<name>url</name>
<value>oracle:thin://ncs45.sj.ncsoost.co.jp:1521/ncsecsite</value>
</parameter>
</ResourceParams>
</Context>


まる3日間調べても解決することができませんでした。
もしこのような現象の解決方法をご存知の方いましたら、お教えいただけませんでしょうか?
とても困っています。。。


[ メッセージ編集済み 編集者: bk 編集日時 2005-11-18 09:40 ]
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2005-11-18 10:14
JDBCドライバは $CATALINA_HOME/common/lib でいいかと。

で、問題なのはserver.xmlのurlパラメータでは?
書き方を再度、確認されては?
紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2005-11-18 10:36
参考までに

http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
bk
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2005-11-18 12:59
ご返答大変ありがとうございます。

>で、問題なのはserver.xmlのurlパラメータでは?
>書き方を再度、確認されては?

以下の修正を行いました。

■誤
<value>oracle:thin://*********:1521/ncsecsite</value>

■修正内容
<value>jdbc:oracle:thin://********:1521/ncsecsite</value>

1.jdbc:を追加
2.念のため*******をホスト名からIPアドレスに変更

のように修正しました。
昨日も1番の作業はやったのですが、あるサイトに「jdbc:」は不要と書かれていたので
消していました。

■修正後に出たエラー内容
しかしこのように書くと今度は次のエラーに変わります。
先ほど、これも書くべきでした。申し訳ありません。

Caused by: java.sql.SQLException: I/O例外です。: The Network Adapter could not establish the connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:877)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)
... 60 more

これもいろいろ調べたところ、ソケット接続が確立できていないようです。

今度はデータベースサーバとの接続の問題なのかなと思ったのですが、
データベースサーバとリスナは起動していますし、ファイアウォールで遮断など
もしていません。
コマンド接続からtelnetでアクセスしても問題なく接続できるので、ネットワーク
の問題でもなさそうです。。

申し訳ありませんが、他に考えられる原因がありましたら
再度ご指導の程よろしくお願い致します。

[ メッセージ編集済み 編集者: bk 編集日時 2005-11-18 13:00 ]
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2005-11-18 13:07
よく見ましょう。

紅茶さんが提示してくれたURLには
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:myschema@127.0.0.1:1521:mysid</value>
</parameter>
と書いてありますよ。

<value>jdbc:oracle:thin://********:1521/ncsecsite</value>
じゃなくて
<value>jdbc:oracle:thin:@********:1521:ncsecsite</value>
なのでは?

[ メッセージ編集済み 編集者: yuzy 編集日時 2005-11-18 13:08 ]
紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2005-11-18 18:33
yuzyさん補足ありがとうございます。

URLの部分を
oracle:thin:@アドレス:1521:インスタンス名

に変更してみてください。
他におかしいところはなさそうですが・・・
bk
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2005-11-18 18:53
>yuzyさん、紅茶さん、ハツキタツミさん

情報ありがとうございます。

oracle:thin:@アドレス:1521:インスタンス名

上記のように修正したらうまく接続することができました。

本当にありがとうございました!!
1

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