jdbc

いいね!! http://www.wakhok.ac.jp/~tomoharu/web2004/text/index_c7.html
http://www.wakhok.ac.jp/~tomoharu/web2004/text/index_c8.html
①Servlet から JDBC を使う
ソース  Class.forName(“org.hsqldb.jdbcDriver”);
String url = “jdbc:hsqldb:hsql://localhost”;
Connection con = DriverManager.getConnection(url, “sa”, “”);

Build時 javac -classpath
“%CATALINA_HOME%\common\lib\servlet.jar;%HSQLDB_HOME%\lib\hsqldb.jar”
JDBCTestServlet.java

実行時 WEB-INF/ — web.xml
|- classes/ — JDBCTestServlet.class
|- lib/     — hsqldb.jar (JDBCドライバが含まれている)

②JNDI と DataSource の利用
ソース             Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup( “java:comp/env/jdbc/library”);
Connection con = ds.getConnection();

JNDI (Java Naming and Directory Interface)は、JavaでLDAPなどのディレクトリサービスを利用するためのAPIです。名前をキーにしてオブジェクトを取り出すことができます。J
ここでJNDIを利用しています。
1行目で、InitialContextを取得しています。InitialContextとは、JNDIで検索をするときの出発点です。ファイルシステムに例えると、ルートディレクトリに相当します。Contextは、ディレクトリに相当します。
2行目と3行目で、Contextのlookupというメソッドを使い、”java:comp/env/jdbc/library”という名前からDataSource型のインスタンスを取得しています。この名前を「リソース参照名」といいます。Javaのコンポーネントは、”java:comp/env/”という文字列からはじまるリソース参照名を持つように定められています。
4行目で、DataSource型のインスタンスからConnectionを取得しています。
JDBCドライバの例と違って、ドライバ名やデータベースのURL、ユーザ名やパスワードといった情報がプログラムから消えています。こうした情報は、server.xmlやweb.xmlといった設定ファイルに記述されており、そこからJNDIに登録されます。アプリケーションでは、抽象的な「名前」からDataSourceオブジェクトを取得するだけで良いのです。もし取り扱うデータベースが変更されたとしても、データベースへのアクセスに必要な情報はJNDIに登録されているので、設定ファイルを変更するだけで済み、プログラムの変更は必要ありません。プログラムの保守性が高まります。
Web.xml まず、web.xmlでJNDIの利用を宣言します。
<resource-ref>
<res-ref-name>jdbc/library</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
resource-refという要素でJNDIの利用を宣言しています。
この子要素を見てみましょう。
res-ref-nameという要素で、リソース参照名を記述しています。JNDITestServlet.javaでは”java:comp/env/jdbc/library”という名前を使っていました。この名前から、Javaのコンポーネントの識別に使われる”java:comp/env/”を取り除き、残った”jdbc/library”が指定されています。
res-typeという要素では、JNDIに格納されているコンポーネントの型を記述します。ここでは、”javax.sql.DataSource”を指定しています。
また、res-authという要素では、データベースの認証をどこで行うか指定します。ここでは、Webコンテナ(Tomcat)で認証を行うので、”Container”を指定します。

server.xml の設定
<Context path=”/test” docBase=”test” reloadable=”true”>
<Resource name=”jdbc/library” auth=”Container”
type=”javax.sql.DataSource” />
<ResourceParams name=”jdbc/library”>
<parameter>
<name>driverClassName</name>
<value>org.hsqldb.jdbcDriver</value>
</parameter>
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:hsqldb:hsql://localhost</value>
</parameter>
</ResourceParams>
</Context>
Tomcat への配置
JDBCTestServlet.javaでは、JDBCドライバが含まれているhsqldb.jarをWEB-INF/libにコピーしました。しかし、JNDITestServlet.javaでは、server.xmlにデータベースの設定情報を記述しました。
そこで、単なる一つのWebアプリケーションだけでなく、Tomcat全体で共有できる場所にhsqldb.jarをコピーする必要があります。
そこで、hsqldb.jarを%CATALINA_HOME%\common\libにコピーします。

③コネクション・プーリング
Connectionの取得という処理は、時間がかかる「重い」処理です。
そこで、「コネクション・プーリング」という手法が考案されました。まず、複数のConnectionをあらかじめ作成しておき、ためておきます。データベースを利用するときだけConnectionをアプリケーションに貸し出し、
アプリケーションでConnectionがcloseされたら元に戻します。この手法によって、Coonectionは新たに作成されることはなく、アプリケーションで使いまわされます。結果として、データベースに早くアクセスできます。
コネクション・プーリングを行うために、Jakarta Projectから「DBCP」というライブラリが提供されています。直接DBCPのクラスを操作して、コネクション・プーリングの機能を使うことができます。
しかし、TomcatにはDBCPが既に組み込まれており、server.xmlとweb.xmlを変更するだけでコネクション・プーリングを利用できます。

server.xml の設定
Servletのプログラムは、上記に解説したJNDITestServlet.javaをそのまま利用できます。また、web.xmlも、JNDIの利用を宣言したサンプルをそのまま利用できます。
ここでは、server.xmlについて見てみましょう。
<Context path=”/test” docBase=”test” reloadable=”true”>
<Resource name=”jdbc/library” auth=”Container”
type=”javax.sql.DataSource” />
<ResourceParams name=”jdbc/library”>
<parameter>
<name>factory</name>      JNDIのときのserver.xmlと比べると、parameterの数が増えています。新しく追加されたparameterについて解説します。
<value>      factoryという要素では、DataSourceを生成するためのクラスを指定します。
org.apache.commons.dbcp.BasicDataSourceFactory      ここではDBCPを使うので、org.apache.commons.dbcp.BasicDataSourceFactoryを指定しています。
</value>      maxActiveという要素では、同時に利用できるConnectionの数を指定します。この数を超えてConnectionを利用しようとすると、
</parameter>      別のアプリケーションがConnectionを使い終わるまで待つことになります。
<parameter>      maxWaitという要素では、Connectionの利用を待つ時間を指定します。単位はミリ秒です。ここでは10秒と指定されています。
<name>driverClassName</name>      maxIdleという要素では、Connectionの利用がない状態のときに、いくつのConnectionをためておくかどうか設定します。
<value>org.hsqldb.jdbcDriver</value>
</parameter>
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:hsqldb:hsql://localhost</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
</ResourceParams>
</Context>

Add a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注