- PR -

DataSourceを利用したORACLEへの接続について

1
投稿者投稿内容
non
会議室デビュー日: 2008/01/30
投稿数: 12
投稿日時: 2008-01-30 13:31
お世話になります。

DataSourceを利用したORACLEへの接続ができずに困っております。
開発環境では、本番環境にあるDBへの接続ができるのですが、
.warにして本番環境へ移行すると、下記のようなエラーが出て接続できません。

【開発環境】
(WinXP)
eclipse 3.3.1.1 コンテキスト宣言モード:server.xml
tomcat-5.5.25
ojdbc14.jarを利用。
(eclipseのビルドパスへの反映、およびtomcat common/libへはコピー済み)

【本番環境】
(Linux)
tomcat-5.5.25
DB:oracle10g
ojdbc14.jarを利用。
(common/libへはコピー済み)

【ソース】
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/orcldb");
conn = ds.getConnection();
conn.setAutoCommit(false);
stmt = conn.createStatement();

【META-INF/context.xml】
<Context path="/Project"
reloadable="true"
docBase="Project" >
<Resource
name="orcldb"
auth="Container"
type="javax.sql.DataSource"
maxActive="500"
maxIdle="1"
maxWait="10000"
username="name"
password="pass"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@***.***.***.***:1521:sid"
/>
</Context>

.warを本番環境の/webappに配備すると、$CATALINA_HOME/conf/Catalina/localhost/Project.xmlが自動生成されます。
"oracle.jdbc.driver.OracleDriver" は"oracle.jdbc.OracleDriver"としても同じ結果でした。

【web.xml】
<resource-ref>
<description>DB Connection</description>
<res-ref-name>orcldb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

【エラー】
致命的:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource
(・・・省略)
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1130)
... 32 more


Datasourceによる指定ではなく、Class.forNameなどでドライバを
直接指定した場合には、本番環境でもDBへ接続しデータへアクセスできました。

このようなエラーについては、ネットで検索すると類似したものがいくつか
見つけられたのですが、どうにも解決につながら、もう三日くらい悩んでいます。
common/libにあるojdbc14.jarを読みに行けずにエラーになっているのでしょうか。

ご存知の方、解決策を教えていただけないでしょうか。
よろしくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-01-30 15:05
勘ですが、クラスローダの関係ではないでしょうか。

DataSourceの初期化の段階では
WebAppクラスローダ(WEB-INF/libが参照できる)が使われず
Commonクラスローダ(TOMCAT_HOME/common/libが参照できる)で
呼び出されているんじゃなかったかな。
non
会議室デビュー日: 2008/01/30
投稿数: 12
投稿日時: 2008-01-30 15:37
>勘ですが、クラスローダの関係ではないでしょうか。
>DataSourceの初期化の段階では
>WebAppクラスローダ(WEB-INF/libが参照できる)が使われず
>Commonクラスローダ(TOMCAT_HOME/common/libが参照できる)で
>呼び出されているんじゃなかったかな。

さっそくお返事を頂きまして、ありがとうございます。

ojdbc14.jarは
プロジェクトのWEB-INF/libとTOMCAT_HOME/common/libの両方に置いています。
ですので、WebAppクラスローダとCommonクラスローダのどちらででも、呼び出せると思うのですが・・・、
他にも設定が必要なのでしょうか?
ykSiR
会議室デビュー日: 2006/10/03
投稿数: 16
投稿日時: 2008-01-30 17:30
引用:

未記入さんの書き込み (2008-01-30 15:37) より:
ojdbc14.jarは
プロジェクトのWEB-INF/libとTOMCAT_HOME/common/libの両方に置いています。


両方に入れているならClass.forNameを用いた方はWEB-INF/libのojdbc14.jarを利用しているかと思います。
TOMCAT_HOME/common/libに入れたojdbc14.jarのパーミッション等をチェックしてみてはいかがでしょうか?

蛇足ですが、Tomcat5.5だとTOMCAT_HOMEではなくCATALINA_HOMEですね
non
会議室デビュー日: 2008/01/30
投稿数: 12
投稿日時: 2008-01-31 15:24
引用:

ykSiRさんの書き込み (2008-01-30 17:30) より:
両方に入れているならClass.forNameを用いた方はWEB-INF/libのojdbc14.jarを利用しているかと思います。
TOMCAT_HOME/common/libに入れたojdbc14.jarのパーミッション等をチェックしてみてはいかがでしょうか?



コメントありがとうございます。
パーミッション等も確認してみましたが、特に問題はないようでした。

これはもう、Tomcat自体がおかしくなってしまったのかと思い、
Tomcatを再インストールしたところ、以下のようにエラーが変わりました。

【エラー】
java.lang.NoClassDefFoundError
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1165)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
(…略)

とりあえず、$CATALINA_HOME/common/lib/ojdbc14.jarは見れているのか・・・
non
会議室デビュー日: 2008/01/30
投稿数: 12
投稿日時: 2008-01-31 17:27
解決しました。

最後はJAVAのJREへのパスの問題でした・・・。
自分が構築した環境でなかったので気づくのが遅かったです;

ご親切にアドバイス下さって、ありがとうございました。
1

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