読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Tomcatでデータソースを使ってコネクションを取得。JDBC経由でDBに接続する方法。

<スポンサーリンク>

データソースとは

データソースとは、データベースにアクセスする実装をカプセル化したもの。
RDBMSの違いにかかわらず、共通のインターフェースを用いて利用できる。
データベースのドライバやURLの情報はアプリケーションとは別の、アプリケーション"サーバ"側で管理される。そして、アプリケーションからはデータソースをネーミングサービスからlookupすることでデータベースに接続できる。
アプリケーションからルックアップするのに必要になるのは、データソースのJNDI名だけとなる。
ちなみに、JNDIとはJava Naming and Directory Interfaceのこと。
コネクションおwサーバ側の接続プールにストックし、使いまわすことで、負荷が大きいコネクション作成処理を最小限に抑えることができる。

Tomcatでデータソースを利用する方法

最もシンプルにTomcatにデータソースを登録する方法は、コンテキストファイルにResource要素を登録する方法である。
Eclipseのプラグインを使う場合は、以下のようなディレクトリにcontext.xmlがあるので、こちらを編集する。
普通のTomcatだったら、META-INF以下にある。

\eclipse\pleiades\tomcat\6.0\conf

context.xmlを以下のように編集する。

    <Resource name="jdbc/sho322db" auth="Container"
      type="javax.sql.DataSource"
      username="root" password="1234"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/test_db"/>

パラメータの説明

  • name

nameというのは、リソースにつける名前のこと。任意の名前を記述できる。サーブレットからはこの値を利用してデータソースを取得する。

  • type

DataSourceのインターフェースを指定する

  • auth

認証のタイプを指定する。ApplicationかContainerを指定する。
Applicationを指定した場合は、Webアプリ側で認証のコードを書く必要がある。

  • username

ユーザー名

  • password

パスワード

  • driverClassName

JDBCドライバのクラス名

  • url

JDBCのURLを指定する
参考)
http://wiki.apache.org/tomcat/UsingDataSources

Tomcat側のソース

こんな感じのメソッドを持つDBManager的なクラスを作る。

private static String dataSourceJndiName = "java:comp/env/jdbc/sho322db";

public static Connection getDataSourceConnection() throws NamingException, SQLException {
	Connection con = null;

	InitialContext ctx = new InitialContext();
	DataSource ds = (DataSource)ctx.lookup(dataSourceJndiName);
	con = ds.getConnection();
	System.out.println(con);

	return con;
}

で、このクラスからコネクションを取得して利用すればいい。適当だけどサンプルはこんな感じ。

public void insertMember(MemberBean bean) {
	String insertSql = "INSERT INTO " + mamberTableName + "(first_name,last_name,first_name_yomi," +
			"last_name_yomi, mail_address,seibetsu_flg) values(?,?,?,?,?,?)";
	Connection con;
	try {
		con = DBManager.getDataSourceConnection();
		PreparedStatement ps = con.prepareStatement(insertSql);
		ps.setString(1, bean.getFirstName());
		ps.setString(2, bean.getLastName());
		ps.setString(3, bean.getFirstNameYomi());
		ps.setString(4, bean.getLastNameYomi());
		ps.setString(5, bean.getMailAddress());
		ps.setInt(6, bean.getSeibetsuFlag());
		int count = ps.executeUpdate();
		System.out.println("count:" + count);
		ps.close();
		con.close();
	} catch (NamingException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

サーブレットからJDBC経由でMysqlに接続したときに文字化けするときの調べ物のメモ

http://www.kinusati.net/2010/06/20/mysql%E3%81%ABjdbc%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%9F%E3%82%89%E3%80%81%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91/

http://www.oracle.co.jp/forum/thread.jspa?threadID=11000435

上記のサイトを参考に以下をcontext.xmlに記載すると

url="jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8"/>

こんなエラーが出る。

The reference to entity "characterEncoding" must end with the ';' delimite

なので、こんな感じで、タグに属性を付与すればエラーはでない。

<Resource name="jdbc/test_db" auth="Container"
  type="javax.sql.DataSource"
  username="root" password="1234"
  driverClassName="com.mysql.jdbc.Driver"
  useUnicode="true"
  characterEncoding="utf-8"
  url="jdbc:mysql://localhost:3306/test_db"/>

ただ、結果として、characterEncodingやuseUnicodeを設定しなくても、JDBC経由でencodeのエラーは発生しなかった。

読んだ本

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)