MJ-WAVE.COM

  1. MJ-WAVE.COM
  2. Web開発
  3. JDBCとJNDIを使ってデータベース(MySQL)に接続する時に必要な設定【設定環境:Eclipse4.2】

JDBCとJNDIを使ってデータベース(MySQL)に接続する時に必要な設定【設定環境:Eclipse4.2】

ツイート
このエントリーをはてなブックマークに追加

ブログや書籍通りに設定すれば簡単なんだけど、つまづいて、なんでだろうってあれこれ小一時間悩んで、原因が単なるスペルミスだったからメモしておこうなんて思っていません。

JDBCやJNDIについてはwikipediaとかに詳しい説明がありますので、そちらを参考にしてくださいね。
JDBC – Wikipedia
Java Naming and Directory Interface – Wikipedia

ちなみに当記事では、Eclipse上で動作させることを念頭に置いており、TomcatにJDBCドライバのインストール方法は省略しています。

server.xmlを編集する

Eclipseにサーバーを登録した際に生成されたフォルダに入っているserver.xmlを編集します。(キャプチャはEclipseのエクスプローラー上でのserver.xmlの場所)
スクリーンショット 2013-02-05 10.20.22

server.xml内の<GlobalNamingResources> 〜 </GlobalNamingResources>の中に、下記コードを追記します。

<Resource driverClassName="com.mysql.jdbc.Driver" initialSize="5" maxActive="5" maxIdle="5" maxWait="5000" name="[データベースの名前]" type="javax.sql.DataSource" url="jdbc:mysql://[データベースのアドレス/データベース名]" username="[ユーザー名]" password="[パスワード]" />

driverClassName属性にcom.mysql.jdbc.Driverと記述することで、JDBCを使用することを宣言しています。
name属性の[データベースの名前]は任意で大丈夫ですが、この後も記述した名前を使用するので注意ですよ。
url属性の[データベースのアドレス/データベース名]は見たまんまですが、例えばデータベースのアドレスが127.0.0.1:8889で、データベース名がsampleだった場合は 127.0.0.1:8889/sample と記述します。username属性の[ユーザー名]、password属性の[パスワード]はデータベースに設定した情報を記述してください。

ここでは、[データベースの名前]をlocalDBとし、[データベースのアドレス/データベース名]を127.0.0.1:8889/sample、[ユーザー名]をusername、[パスワード]をhogefugaとして設定すると以下のような記述になります。

<Resource driverClassName="com.mysql.jdbc.Driver" initialSize="5" maxActive="5" maxIdle="5" maxWait="5000" name="localDB" type="javax.sql.DataSource" url="jdbc:mysql://127.0.0.1:8889/sample" username="username" password="hogefuga" />

context.xmlを編集する

server.xmlと同ディレクトリ内にあるcontext.xmlを編集します。
スクリーンショット 2013-02-05 10.20.30

context.xml内の<Context> 〜 </Context>の中に、下記コードを追記します。

<ResourceLink name="localDB" global="localDB" type="javax.sql.DataSource" />

[データベースの名前]である、localDBをname属性とglobal属性に記述します。

web.xmlを編集する

web.xmlはアプリケーション側のファイルになるので、プロジェクトのWEB-INFディレクトリ直下のweb.xmlを編集します。
スクリーンショット 2013-02-05 10.49.08

web.xml内の<web-app> 〜 </web-app>の中に、下記コードを追記します。

<resource-ref>
  <res-ref-name>localDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

<res-ref-name> 〜 </res-ref-name>には[データベースの名前]であるlocalDBが入ります。

サーブレットにコードを記述する

下記コードはサーブレットに記述します。DBの接続確認をするだけの簡単なコードをdoGet関数内で実行します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Connection conn = null;
	try {
		InitialContext initCtx = new InitialContext();
		// xmlに記述した[データベースの名前]の前に必ず、java:comp/env/ を追記すること
		DataSource ds = (DataSource) initCtx.lookup("java:comp/env/localDB");			
		conn = ds.getConnection();
		log("接続完了");
	} catch(Exception e) {
		throw new ServletException(e);
	} finally {
		try {
			conn.close();
			log("接続終了");
		} catch(SQLException e) {
			throw new ServletException(e);
		}
	}
}

コメントにも書いてありますが、xmlに記述した[データベースの名前]の前に必ずjava:comp/env/を追記することを忘れないようにしましょう。上記の内容でテスト行いコンソールに「接続完了」と「接続終了」と表示されれば成功です。データベース側が起動してなかったりするとエラー出ますので注意です。

エラー時の注意

javax.naming.NameNotFoundException: 名前 localDB はこのコンテキストにバインドされていません とかいうエラーが出た場合は、上記の記述のどこかが間違ってるのが原因かもしれません。もう一度スペルミス等が無いか確認しましょう。(僕はこれでした)

以上がJDBCとJNDIを使う場合のデータベース(MySQL)に接続する時に必要な設定です。メモメモ。

もし、この記事が役に立ったらシェアしてくださいね!

ツイート
このエントリーをはてなブックマークに追加
タグ
, ,
カテゴリ

RECOMMEND BOOKS 筆者オススメ!! この記事に関連する書籍一覧

この記事に関連する書籍はありません