Tomcat8 + Servlet + MySQLのコネクションプールを作る
目次
1)やりたいこと
DBのコネクションを取得するためには以下の処理で実装するんだけど、
Connection conn = null; String url = "jdbc:mysql://localhost:3306/sample"; String user = "root"; String password = ""; try(conn = DriverManager.getConnection(url, user, password);){ // データベースに対する処理 }catch (SQLException e){ // エラー処理 }
↑開発する上で各メンバー毎にクローズのし忘れとか発生してしまうし、
コネクションプール作るのがベターなのでコネクションプールで実装してみた。
3)やりたいことはやってみる
まずは、コネクションプールを取得するクラスを作成しーの
package jp.sample.DAO; import java.sql.Connection; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class DataSourceManager { private final String JNDI = "java:comp/env/jdbc/mysql"; protected Connection connection; /** * データベースコネクション取得 */ public DataSourceManager() { try { Context context = new InitialContext(); DataSource dataSource = (DataSource) context.lookup(JNDI); connection = dataSource.getConnection(); connection.setAutoCommit(false); } catch (Exception e) { e.printStackTrace(); } } }
各DAOクラスで継承する
package jp.sample.DAO; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDAO extends DataSourceManager { // 主キー検索 private final String SELECT_BY_ID = "SELECT * FROM USER WHERE USER_ID = ?"; /** * 主キー検索 * @param id * @return UserVo ユーザー情報を返却、データが存在しない場合 null */ public UserVo selectById(String id) { UserVo result = null; try (PreparedStatement ps = connection.prepareStatement(SELECT_BY_ID)) { ps.setString(1, id); ResultSet rSet = ps.executeQuery(); result = resultSetAttribute(rSet); // 取得した値をセットするメソッドを別で作成しているのでそれを呼ぶ } catch (SQLException e) { e.printStackTrace(); } return result; } // 以下割愛
これで終わり!ってなればいいんやけど、そうもいかない。
Tomcatのバージョンで設定方法が異なっていてserver.xmlに書けやとかうんたらで、むしろこちらの方がめんどくさかった。
/[プロジェクト名]/WebContent/META-INF/context.xml
↑結果、context.xmlに設定情報を書き込むでOK。
(パスワードとかurlとかは各DBに合わせて修正)
こんな感じ。
※注意
コネクションプールを取得するクラスで定義している"JNDI"の「java:comp/env/xxxx」とcontext.xmlの「name="xxxx"」が一致すること。
private final String JNDI = "java:comp/env/jdbc/mysql"; name="jdbc/mysql"
これで接続できるはず!!!