Webアプリケーションサーバーを利用している場合、データベースとの接続はデータソース経由で実施するのがふつうです。
データソースを利用すると、処理が終わってもデータベースとの接続を保持(コネクション・プーリング)してくれるので、2回目以降のアクセスでは、接続された状態からスタートできるため、処理性能が向上します(^^♪
Tomcat9データソース経由でOracleへ接続するサンプル
今回は、「testweb」アプリケーション内にDataSourceServletを作成します。
ブラウザでは、「http://localhost:8080/testweb/datasource」でアクセスします。
設定
testweb.xml(ファイル名はWebアプリケーション名)
Tomcatの場合、xmlにデータベースの接続情報を記述します。
※商用アプリケーションサーバを利用している場合、付属の管理ツールで設定します。
配置先:<CATALINA_HOME>/conf/Catalina/localhost/testweb.xml
1 2 3 4 5 6 7 8 9 10 | <!--?xml version="1.0" encoding="UTF-8"?--> <Context> <Resource name="jdbc/oraora" auth="Container" type="javax.sql.DataSource" username="USERNAME" password="PASSWORD" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:xe"/> </Context> |
※CATALINA_HOME = Tomcatを配置したルートディレクトリ
web.xml
こちらは、データソースに関する記述はとくに必要ありません。
普段どおり、サーブレット名、URL等を書いておきます。
配置先:<CATALINA_HOME>/webapps/testweb/WEB-INF/web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet> <description></description> <display-name>DataSourceServlet</display-name> <servlet-name>DataSourceServlet</servlet-name> <servlet-class>DataSourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DataSourceServlet</servlet-name> <url-pattern>/datasource</url-pattern> </servlet-mapping> </web-app> |
ソース
Tomcatで設定した情報をもとにデータソース経由でOracleコネクションを取得。
DUAL表より取得した値をブラウザに返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.naming.InitialContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; public class DataSourceServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String result = null; //DBに接続(URL,USER_ID,PASSWORD) InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oraora"); try(Connection conn = ds.getConnection(); PreparedStatement pstmt = conn.prepareStatement("select dummy from dual where dummy = ?")){ //SQLを発行 pstmt.clearParameters(); pstmt.setString(1, "X"); try(ResultSet rs = pstmt.executeQuery()) { //結果を取得 while(rs.next()) { result = rs.getString("dummy"); } } } //結果をブラウザへ StringBuilder sb = new StringBuilder(); sb.append("<html><body>").append(result).append("</body></html>"); try(PrintWriter pw = response.getWriter()){ pw.write(sb.toString()); pw.flush(); } }catch(Exception e) { e.printStackTrace(); } } } |
実行結果
DUAL表の値「X」が、こんな感じで返ってきますw
サンプルの解説
データベースの接続は、DataSource#getConnection()にて、データソースから接続を取得します。
データソースから接続を取得する場合、”java:comp/env/” + 設定名で接続を取得します。
サンプルの場合、Tomcatには「jdbc/oraora」で定義したので、プログラムでは「java:comp/env/jdbc/oraora」を指定します。
以降の処理は、ドライバ経由で接続した処理と同じです。
プログラム上は、try-with-resources文で「接続を閉じてね」って言ってますが、実はこのとき、コネクションプールに接続を返すだけで、接続は閉じていません。
Tomcat(データソース)側では、このデータベースとの接続を閉じることなく、次回データベースの接続を要求されたときのために、コネクションプールに接続したまま保管しておいてくれます。
Oracleにドライバ経由で接続する方法は?
Oracleにドライバ経由で接続する方法は、こちらを見てください。