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

「Tomcat」GlobalNamingResources でグローバルな JNDI リソースを定義する

今まで特に気にせず「Tomcat で JNDI リソースの定義」って言えば context.xml ( META-INF 配下のやつ ) でやってました。ただ、今回、server.xml の GlobalNamingResources でもできるらしいということを知ったので、こっちでやってみた。その時のメモです。

Apache Tomcat 7 Configuration Reference (7.0.52) - The GlobalNamingResources Component
https://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html

Apache Tomcat 7 (7.0.52) - JNDI Resources HOW-TO
https://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html

※ それぞれ目的は違うみたいです。「context.xml の Resource はアプリ単位でリソース管理したい時」、「GlobalNamingResources はグローバルにリソース管理したい時 ( そのまま・・・ )」で使い分ける感じですかね。

1. server.xml の GlobalNamingResources に Resource の設定を追記

<GlobalNamingResources>
 - 略 -
  <Resource name="global/jdbc/oracle"
            auth="Container"
            type="javax.sql.DataSource"
            username="test"
            password="test"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@***.***.***.***:1521:orcl" />
</GlobalNamingResources>


2. context.xml ( META-INF 配下のやつ ) に ResourceLink の設定を追記

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <ResourceLink name="jdbc/oracle"
                global="global/jdbc/oracle"
                type="javax.sql.DataSource" />
</Context>


3. JNDI リソースを使用するサーブレットの作成

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

@WebServlet("/JDBCSample")
public class JDBCSample extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private DataSource ds = null;

	public JDBCSample() {
		super();
	}

	public void init() throws ServletException {
		try {
			InitialContext ic = new InitialContext();
			ds = (DataSource) ic.lookup("java:comp/env/jdbc/oracle");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");

		Connection con = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			con = ds.getConnection();
			st = con.createStatement();
			rs = st.executeQuery("select * from test");
			while (rs.next()) {
				out.println(rs.getString("id") + ":" + rs.getString("name"));
				out.println("<br/>");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				st.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		out.println("</body>");
		out.println("</html>");
	}
}

※ 以下のエントリーからのコピペです。
・「JavaJDBC でデータベースに接続する - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2014/02/09/130420


上記で作業完了です。あとは Tomcat 起動してサーブレットにアクセスすれば、DB から取得した値が表示されるはずです。

[ 環境情報 ]
CentOS 6.2
Apache Tomcat 7.0.52

以上です。