Introduction
使用するデータベースがMySQLの後継であるMariaDBに決まった。
ServletアプリケーションからアクセスするときにTomcatで定義したデータソースのDB接続Poolを使いたい。
Environment
- Tomcat 7.0.69
- MariaDB 5.5.52
Procedure
前提
- TomcatとMariaDBがインストールされ、いずれも正常稼働できる状態である
サーバでの手順
①JDBC接続でMariaDBへ接続するためのドライバを入手する
https://downloads.mariadb.org/connector-java/
②入手したドライバをTomcatのライブラリに配置する
/usr/share/java/tomcatにmariadb-java-client-x.x.x.jarを配置
③Tomcatのコンテキストに接続Poolの定義を追記
/etc/tomcat/context.xml に追記する
- パターンA Commons DB Connection Poolを利用するパターン
<Resource name="jdbc/MariaDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="20" maxWait="-1" username="ユーザー" password="パスワード"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/データベース名?zeroDateTimeBehavior=convertToNull"
validationQuery="SELECT 0" factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>
- パターンB Tomcat Jdbc Connection Poolを利用するパターン tomcat 7.0.19以降
<Resource name="jdbc/MariaDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="20" maxWait="-1" username="ユーザー" password="パスワード"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/データベース名?zeroDateTimeBehavior=convertToNull"
validationQuery="SELECT 0" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>
④Tomcatの再起動
systemctl restart tomcat
Java Sample
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* コネクションプールを利用したDB接続
*
*/
public class DBConnectionUsePool {
private PreparedStatement pstmt = null;
private Connection conn = null;
public synchronized boolean connect(){
try {
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
this.conn = ds.getConnection();
} catch (NamingException e) {
return false;
} catch (SQLException e) {
return false;
}
return true;
}
/**
* SQLをセットする
*
* @param sql
* @return
*/
public synchronized boolean sqlSet(String sql){
if(this.conn == null) {
return false;
}
try {
this.pstmt = this.conn.prepareStatement(sql);
} catch (SQLException e) {
return false;
}
return true;
}
/**
* ステートメントを取得
* @return
*/
public synchronized PreparedStatement getStatement(){
return this.pstmt;
}
}