- PR -

Tomcat+MySQLでJNDIのLookupができない

投稿者投稿内容
ベータ
会議室デビュー日: 2006/11/10
投稿数: 14
投稿日時: 2006-11-10 16:56
皆さんに色々指摘いただいた点を反映して現在の状況をまとめています。
未だ解決していません。
よろしくお願いします。

【環境】
・OS : Windows XP SP2
・JVM : 1.5.0_09
・Tomcat : 5.5.20
・MySQL : 5.0.24
・JDBCドライバ : [TomcatインストールDIR]\common\lib\mysql-connector-java-5.0.3-bin.jar

【エラー内容】
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)


Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(Unknown Source)

【server.xmlの追記】
<Context path="/test01" docBase="test01" debug="0"
reloadable="false" crossContext="true">

<Resource name="jdbc/Struts" auth="Container" type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="password" driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=Windows-31J" />
</Context>

【web.xml の追記】
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Struts</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

【JNDI lookup部分のソース】
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/Struts");
db = ds.getConnection();

【アクセスURL】
http://localhost:8080/test01/・・・

【その他】
"server.xml"に追記したパラメータと同じ設定でJDBCアクセスを行うmain()を持った
Javaアプリからは問題なくアクセスできるのでパラメータに不正はないと思われます。

[ メッセージ編集済み 編集者: ひろし 編集日時 2006-11-10 16:57 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-11-10 17:47
引用:

ひろしさんの書き込み (2006-11-10 16:56) より:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'



今までの流れからすると、ここが一番怪しいですね。
ドライバのクラス名もJDBC URLも共にnullなようです。

Tomcat 5.0までは<Resource>にはtypeとnameだけで、
他のパラメータは<ResourceParams>に書いていました。

なので、5.5の定義ファイルを5.0が解釈した場合は、
JNDIにはjavax.sql.DataSourceとしてbindされているものの、
ドライバやJDBC URL等の接続情報が存在しない状況になりそうです。

実はTomcat 5.0で実行していた、なんて事はないですか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-11-10 17:57
とりあえず似たような現象についての書き込みを載せておきます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=21956&forum=12&start=8

以下余談
今Tomcat5.5のドキュメント見るとserver.xmlに設定するようになっていますね…
でもPostgresの設定例はやっぱりアプリケーション用の設定ファイルに記述するように
なっていたりしたりして本当はどうなんですかね。
ベータ
会議室デビュー日: 2006/11/10
投稿数: 14
投稿日時: 2006-11-10 18:00
あしゅさんいつもアドバイスありがとうございます。

引用:

あしゅさんの書き込み (2006-11-10 17:47) より:
実はTomcat 5.0で実行していた、なんて事はないですか?



なるほど。
何回も確認しましたが、5.5でした。

ちなみに関係ないと思いますが、"test01"はEclipseでTomcatプロジェクトとして作成していますので、
Tomcat 5.5\webapps
下には存在しませんが、特に問題ないですよね?
ベータ
会議室デビュー日: 2006/11/10
投稿数: 14
投稿日時: 2006-11-10 18:18
引用:

ukさんの書き込み (2006-11-10 17:57) より:
とりあえず似たような現象についての書き込みを載せておきます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=21956&forum=12&start=8



ukさんありがとうございます!
以下の方法で解決できました。

[Tomcat 5.5インストールDIR]\conf\Catalina\localhost\test01.xml
に以下を追記。

・元々
<Context
docBase="C:/eclipse/workspace/test01"
reloadable="true"
workDir="C:/eclipse/workspace/test01/work">
<Resource
auth="Container"
description="DB Connection"
name="jdbc/Struts"
type="javax.sql.DataSource"/>
</Context>



・変更
<Context
docBase="C:/eclipse/workspace/test01"
reloadable="true"
path="/test01"
workDir="C:/eclipse/workspace/test01/work">
<Resource
auth="Container"
description="DB Connection"
name="jdbc/Struts"
type="javax.sql.DataSource"
driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=Windows-31J"
username="user" password="password"
maxActive="100" maxIdle="30" maxWait="10000" />
</Context>

でもこれで解決だとすると、記述した内容は、server.xmlのResoureに記述したものと同じなので、
server.xmlの
<Context path="/test01"
・・・
<Resource
・・・
の定義は全く効いていなかったということになりますね。
これが正しい方法なのでしょうか?

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