« パンク初体験 | メイン | コメントスパムを防御できた! »
Tomcat5.5 PostgreSQLでDBCP
2004年09月15日
Tomcat5.5のサンプルを使って、MovableTypeのコンテンツを登録してあるPostgreSQLにアクセスしてみることにしました。

参考にしたのは以下のサイトです。
http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jndi-datasource-examples-howto.html

※設定についての説明がTomcat5.5のコンフィギュレーションファイルと異なる部分があった部分と、自分の環境にあわせた部分をメモしておきます。

上記サイトではPostgreSQLに関してはテストはしていないと書いてありますが、問題なく繋がりました。
#ただアクセスして結果を表示するところまでの確認です。
(ConnectionPoolの内部の動作確認(アクセス数とConnection数の確認など)や性能の調査まではしていません。)
(環境)
Fedora Core1 の1ユーザー下にJDK5.0とTomcat5.5をインストール済。
今現在インストールされているもの。
(表示はabc順)
apache-ant-1.6.2
commons-collections-3.1
commons-dbcp-1.2.1
commons-pool-1.2
jakarta-struts-1.2.2
jakarta-taglibs-standard-1.1.1
jakarta-tomcat-5.5.0
jdk1.5.0
pg74.215.jdbc3.jar

※上記のうち、commons-ではじまる3つは今回のDBCPを使うためにダウンロードしきした。
また、JSTLタグ(SQLなど)を使うためにjakarta-taglibs-standard-1.1.1をダウンロードしました。

I.用意

1)JDBC(PostgreSQL7.4用の最新)
下記サイトからダウンロードしてきました。
$wget http://jdbc.postgresql.org/download/pg74.215.jdbc3.jar

こちらは最初からjar形式ですので、そのまま$CATALINA_HOME/common/libの下におきます。
ただ、パスがうまく通らなかったので(私だけ?)、
$CATALINA_HOME/conf/setclasspas.shを修正して無理やりPATHを通しました。
(Tomcat5.5を動かしてみる参照。)


2)DBCP(コネクションプール)を使うには下記の3つのコンポーネントが必要になります。
Jakarta-Commons DBCP
Jakarta-Commons Collections
Jakarta-Commons Pool

私はそれぞれ以下のサイトからダウンロードしました。
http://sunsite.tus.ac.jp/pub/apache/jakarta/commons/dbcp/binaries/commons-dbcp-1.2.1.tar.gz
http://sunsite.tus.ac.jp/pub/apache/jakarta/commons/collections/binaries/commons-collections-3.1.tar.gz
http://sunsite.tus.ac.jp/pub/apache/jakarta/commons/pool/binaries/commons-pool-1.2.tar.gz

tar xvfz で解凍後、jarファイルにCLASSPATHを通しました。
※JDBCと同様のセッティングをしました。
ここでもなぜか$CATALINA_HOME/common/libに置くだけでは駄目。
自動的にjarファイルにclasspathを通すにはどうすればいいのだろう?(だれか教えて悲願モード)



3)サンプルではSQLタグ(これ簡単でわかりやすくて面白い)と、COREタグを使っていますが、これらを利用するために、Jakarta Taglib Standard 1.1をダウンロードしました。
http://www.meisei-u.ac.jp/mirror/apache/dist/jakarta/taglibs/standard/jakarta-taglibs-standard-current.tar.gz

tar xvfz で解凍後、jarファイルをアプリ(今回はDBTtestという名前のディレクトリ)の下のWEB-INF/libの下に置きます。

II.PostgreSQLの設定
PostgreSQLのデフォルトの設定は、UNIXドメインソケット経由のアクセスになっています。
JDBCからアクセスするためには、TCP/IP経由の接続を可能にしなくてはなりません。

/usr/local/pgsql/data/postgresql.confのtcpip_socketの部分を下記のように修正します。

tcpip_socket = true #もともとあるのでコメントをはずすだけ。

III.Tomcatの設定を行う
1)server.xml
jakartaの説明サイトには、server.xmを修正するように記述してあります。
私も最初HOSTタグの中に、Contextタグを置いて、DatabaseのResoureNameを指定したのですが
実行時にResourceNameを見つけられずに接続できませんでした。

$CATALINA_HOME/confの下をよーく見ると(見なくても?笑)、context.xmlというファイルがあります。
「あっ、ここに設定するのかしら?」
と思って開いてみたら、

<Context>
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>META-INF/context.xml</WatchedResource>
</Context>

っとなっていました。
っというわけで、META-INF/context.xmlに記述することにしました。

META-INF/context.xmlの内容
<Context path="/DBTest" docBase="DBTest"
                        debug="5" reloadable="true" crossContext="true">
        <Logger className="org.apache.catalina.logger.FileLogger"
                prefix="localhost_DBTest_log." suffix=".txt"
                timestamp="true"/>

        <Resource name="jdbc/postgres" auth="Container"
        type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://127.0.0.1:5432/blog"
        username="scott" password="tiger" maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>

※上記設定は下記の場合を想定しています。
Path:DBTest
postgreSQLのポート:5432
データベース名:blog
ユーザー:scott
パスワード:tiger

2)web.xmlの設定
下記内容を追加します。(こちらはjakartaのサイトのサンプル通りです。)
<resource-ref>
    <description>postgreSQL Datasource example</description>
    <res-ref-name>jdbc/postgres</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

IV.いよいよJSP

サンプルのまんまじゃつまらないので、このブログのEntryを一覧表示してみました。
ソースは下記の通りです。
<% response.setContentType("text/html;charset=UTF-8"); %>
<%@ taglib uri="/WEB-INF/sql.tld" prefix="sql" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<%@ page pageEncoding="euc-jp" %>

<sql:query var="rs" dataSource="jdbc/postgres">
    select  entry_title
    from    mt_entry
    order by entry_id
</sql:query>

<html>
<head>
    <title>Entries</title>
    <link rel="stylesheet" href="http://blog.kiyo.com/styles-site.css" type="tex
t/css" />
</head>
<body>
    <div id="container">
        <div id="banner">
        <h1><a href="http://blog.kiyo.com/">megu's blog</a></h1>
        </div>

        <div class="content">
            <div class="contenttitle">
                Entry Titles
            </div>
            <c:forEach var="row" items="${rs.rows}">
                ${row.entry_title} <br />
            </c:forEach>
        </div>
    </div>
</body>
</html>

設定さえできれば、検索はすっごく簡単。
SQLタグってカンタン便利ですね!

クエリを変数として定義するのではなくて、そのまま記述できるというのがいいです。
結果の取得方法も簡単。
面倒なメソッドの記述が一切不要になっています。
これでStatementもResultSetも自動的に制御されちゃうのでしょうか。

MVCできちんと作るのも業務としてはいいかもしれないけれど、ちょこっとりスト出力くらいならこれがわかりやすくていいかも。
(なんとなく、ColdFusionのCFQUERYタグの使い方に似ているようです。)

Tomcat5.5が立ち上がっているときは上記設定のサイトの実行結果を実際にご覧いただけます。
http://www.kiyo.com:8280/DBTest/test.jsp
※実際にこのblogに登録されているエントリーの一覧を動的にご覧いただけます。
 エントリーを追加しても、再構築の必要はもちろんありません(笑)。

投稿者 megu : 2004年09月15日 07:43

コメント

コメントしてください




保存しますか?