すがブロ

sugamasaoのhatenablogだよ

DBコネクションプール(4)

前回→id:seiunsky:20060715:1152948036
約一月ぶりの更新で色々忘れかけているけど、Java→プロジェクトのweb.xmlまでの流れを解説した。
で、Tomcatxml設定でDBCPの詳細設定を決めることになる。
記述する場所はjsp/Servletのプロジェクトの場所などを記述する Context タグの子のタグとして記述していく。説明するのも面倒なのでまるっと公開。

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="プロジェクトの場所" path="アクセスする際のURL" reloadable="true" workDir="プロジェクトのwork用の場所">

	
<!-- name:Javaのコーディングの際にも使用するので慎重に決めること auth:コンテナ(Tomcat)のDBコネクションプール機能を使用するかどうか -->

	<Resource name="jdbc/datastore" auth="Container" 
			type="javax.sql.DataSource"/>
	<!-- name:上記のnameで指定した値を記述 -->
	<ResourceParams name="jdbc/datastore">
		<parameter>
			<name>factory</name>
			<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
		</parameter>
		<parameter>
			<name>maxActive</name>
			<value>20</value>
		</parameter>
		<parameter>
			<name>maxIdle</name>
			<value>30000</value>
		</parameter>
		<parameter>
			<name>maxWait</name>
			<value>100</value>
		</parameter>
		<parameter>
			<!-- DBへアクセスする際のログイン名 -->
			<name>username</name>
			<value>xxx</value>
		</parameter>
		<parameter>
			<!-- DBへアクセスする際のパスワード -->
			<name>password</name>
			<value>xxx</value>
		</parameter>
		<!-- 実際に使用するDBドライバによって変更する(この例はMySQL用) -->
		<parameter>
			<name>driverClassName</name>
			<value>org.gjt.mm.mysql.Driver</value>
		</parameter>
		<parameter>
			<name>url</name>
			<!-- DB接続用のURIの形成 -->
			<!-- 何か設定を行う場合は以下のURLに色々クエリをつなげることでできる -->
			<value>jdbc:mysql://localhost/DB名</value>
		</parameter>
	</ResourceParams>

</Context>

要所にはコメントを記述しているので大体の雰囲気はつかめると思う。
この設定で気をつけることは、DB固有(ドライバ)の設定やURIの設定を適宜変更する、というところ。
ついでに、ざっくりと上記設定を使用したDB接続プログラムっぽいものを書いてみた。

// 初期設定
InitialContext initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/datastore");
Connection connection = ds.getConnection();

// SQL 実行
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery(SQL文を記述);
while (rs.next()) {
	結果の格納
}
//コネクションのクローズ
connection.close();

こんな感じだ。本来は例外処理などが入るため、このままでは動かすことはできない。しかし、プログラムの流れとしては上記のようになると思う。
それと上、記の例ではStatementクラスを使用しているけど、PreparedStatementクラスの方がキャッシュ機能や危険な文字のエスケープなどがある(はず)なので、良いだろう。
個人的に一番気になっているのは、上記の例で言うところの ds.getConnection()〜connection.close() までを一つの流れとして認識しているのだけど、毎回 getConnectinした後に close していてはDBCPとしての機能を果たせるのか? という点だ。毎回 close してしまっては……と思いつつも、 open したら close というのが一般的な気がするので、きちんと close しないとリソースの開放がされないのではないか、とか思ってしまうのであった。Javaマスターな人、いたら意見下さい(笑)。