「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>"); } }
※ 以下のエントリーからのコピペです。
・「Java」JDBC でデータベースに接続する - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2014/02/09/130420
上記で作業完了です。あとは Tomcat 起動してサーブレットにアクセスすれば、DB から取得した値が表示されるはずです。
[ 環境情報 ]
CentOS 6.2
Apache Tomcat 7.0.52
以上です。