HikariCP地址池 – Java

package com.nzdev.util;

import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.util.ResourceBundle;

/**
 * @author 玖洲丿林
 * 使用HikariCP地址池获取数据库连接
 */
public class HikariUtil {
    //Hikari Datasource
    /**
     * 驱动
     */
    private static String driverClassName = "";
    /**
     * 数据库URL
     */
    private static String jdbcUrl = "";
    /**
     * 数据库用户名
     */
    private static String username = "";
    /**
     * 数据库密码
     */
    private static String password = "";
    /**
     * 只读
     */
    private static boolean readOnly = false;
    /**
     * 等待连接池分配连接的最大时长(毫秒)
     */
    private static int connectionTimeout;
    /**
     * 连接idle状态的最大时长(毫秒)
     */
    private static int idleTimeout;
    /**
     * 连接的生命时长(毫秒)
     */
    private static int maxLifetime;
    /**
     * 连接池允许的最大连接数
     */
    private static int maximumPoolSize;


    private static HikariDataSource dataSource = null;

    /**
     *
     */
    static {
        dataSource = new HikariDataSource();
        //读取配置文件
        readProper("HikariConfig");
        //设置配置
        dataSourceConfig();
    }

    /**
     * 读取数据库配置文件
     * @param propertitleFileName 配置文件名
     * @exception java.io.FileNotFoundException,java.io.IOException
     */
    private static void readProper(String propertitleFileName){
        try {
            ResourceBundle bundle = ResourceBundle.getBundle(propertitleFileName);
            driverClassName = bundle.getString("driverClassName");
            jdbcUrl = bundle.getString("jdbcUrl");
            username = bundle.getString("username");
            password = bundle.getString("password");
            readOnly = Boolean.parseBoolean(bundle.getString("readOnly"));
            connectionTimeout = Integer.parseInt(bundle.getString("connectionTimeout"));
            idleTimeout = Integer.parseInt(bundle.getString("idleTimeout"));
            maxLifetime = Integer.parseInt(bundle.getString("maxLifetime"));
            maximumPoolSize = Integer.parseInt(bundle.getString("maximumPoolSize"));
        } catch (Exception e){
            System.err.println("读取数据库参数出现问题:" + e);
            //throw  e;
        }
    }

    /**
     * 设置dataSource各个属性值
     * @exception Exception
     */
    private static void dataSourceConfig(){
        try {
            /**
             * 驱动类位置
             */
            dataSource.setDriverClassName(driverClassName);
            /**
             * 数据库地址
             */
            dataSource.setJdbcUrl(jdbcUrl);
            /**
             * 数据库用户名
             */
            dataSource.setUsername(username);
            /**
             * 数据库密码
             */
            dataSource.setPassword(password);
            /**
             * 只读
             */
            dataSource.setReadOnly(readOnly);
            /**
             * 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
             */
            dataSource.setConnectionTimeout(connectionTimeout);
            /**
             *  一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
             */
            dataSource.setIdleTimeout(idleTimeout);
            /**
             * 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
             */
            dataSource.setMaximumPoolSize(maxLifetime);
            /**
             *  连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
             */
            dataSource.setMaximumPoolSize(maximumPoolSize);
        } catch (Exception e){
            System.err.println("设置dataSource各个属性值异常:" + e);
            //throw  e;
        }
    }

    /**
     * 取得数据库连接
     * @return
     * @throws Exception
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (Exception e){
            System.err.println("取得数据库连接时发生异常:" + e);
        }
        return conn;
    }

    public static void freeConnection(Connection conn){
        if ( conn != null ){
            try {
                conn.close();
            } catch (Exception e){
                System.err.println("释放数据库连接时发生异常:" + e.getMessage());
            }
        }
    }
}
driverClassName=org.mariadb.jdbc.Driver
jdbcUrl=jdbc:mariadb://localhost:3306/test
username=root
password=root
readOnly=false
connectionTimeout=30000
idleTimeout=600000
maxLifetime=1800000
maximumPoolSize=60

发表评论