TomcatでDBCPを使う場合、リソースの設定が正しくないと「このコンテキストにバインドされていません」というエラーが発生します。DBCPのリソースは、Tomcatのコンテキストファイルで設定します。たとえば、localhostにtestというウェブアプリケーションを作る場合、tomcatのconf/Catalina/localhost(このディレクトリがなければ新たに作成します)の下にtest.xmlというファイルを配置します。次に例を示します。
urlの行は表示の都合で2行になっていますが、実際にはダブルクオーテーション内の文字列の途中では改行しないでください。localhost/の次のtestはMySQLのデータベース領域の名前です。クエリー文字列に含まれる&はキャラクタエンティティの書式を使って“&”と書いています。
このリソースを使ったJSPコードの例を次に示します。
いろいろな解説を読むとweb.xmlファイルで<resource-ref>要素を定義するように書いてある場合が多いですが、私の今までの経験では、この設定は無くても動きます。
参考:
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/jndi-datasource-examples-howto.html
<?xml version='1.0' encoding='utf-8'?>
<Context docBase = "C:/prg/test/JSP" pass="/test">
<Resource name="aaa/bbb"
auth="Container"
type="javax.sql.DataSource"
username="Mulder"
password="TrustNo1"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/test?autoReconnect=true【改行しない】
&useUnicode=true&characterEncoding=cp932"
/>
</Context>
Resource要素のname属性がDBCPのリソース名です。Javaのコードからは、"java:comp/env/"からの相対パスでこのリソースにアクセスされます。他の部分を一応説明しておくと、docBaseの"C:/prg/test/JSP"はアプリケーションのディレクトリ、pass=の"/test" はブラウザからアクセスする際のパス、userNameのMulderはMySQLに追加してあるユーザー名passwordはMulderのパスワードです。<Context docBase = "C:/prg/test/JSP" pass="/test">
<Resource name="aaa/bbb"
auth="Container"
type="javax.sql.DataSource"
username="Mulder"
password="TrustNo1"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/test?autoReconnect=true【改行しない】
&useUnicode=true&characterEncoding=cp932"
/>
</Context>
urlの行は表示の都合で2行になっていますが、実際にはダブルクオーテーション内の文字列の途中では改行しないでください。localhost/の次のtestはMySQLのデータベース領域の名前です。クエリー文字列に含まれる&はキャラクタエンティティの書式を使って“&”と書いています。
このリソースを使ったJSPコードの例を次に示します。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/aaa/bbb");
Connection conn= ds.getConnection();
Statement pstmt = conn.createStatement();
ResultSet rs = pstmt.executeQuery("SELECT * FROM person");
while(rs.next()){ %>
<%=rs.getString("name")%><BR>
<%}
pstmt.close();
rs.close();
conn.close();
%>
上のコードでctxオブジェクトのlookupメソッドに指定している"java:comp/env/aaa/bbb"が、リソースへのパスです。ここでの指定とコンテキストファイルの指定が合っていないと、「このコンテキストにバインドされていません」というエラーが発生するわけです。<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/aaa/bbb");
Connection conn= ds.getConnection();
Statement pstmt = conn.createStatement();
ResultSet rs = pstmt.executeQuery("SELECT * FROM person");
while(rs.next()){ %>
<%=rs.getString("name")%><BR>
<%}
pstmt.close();
rs.close();
conn.close();
%>
いろいろな解説を読むとweb.xmlファイルで<resource-ref>要素を定義するように書いてある場合が多いですが、私の今までの経験では、この設定は無くても動きます。
Tomcatのバージョンによる違い【重要】
上記の設定方法はTomcat5.5以降の場合です。Tomcat5.0以前のバージョンをお使いの場合は、下のURLを参照してください。参考:
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/jndi-datasource-examples-howto.html
投稿:竹形 誠司[takegata]/2008年 02月 13日 21時 46分
/更新:2008年 02月 13日 22時 21分