TomcatでMariaDBへの接続Poolを使う

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;
    }
}