收藏HiKariCP

JFinal 使用 HikariCP 数据库连接池

2020-09-15  本文已影响0人  Cooliean

出处: https://www.5-wow.com/article/detail/59

因为某度搜索不出来,所以再这里复制了一下:)

package com.jfinal.plugin.hikaricp;

import javax.sql.DataSource;

import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.activerecord.IDataSourceProvider;
import com.zaxxer.hikari.HikariDataSource;

/**
 * @author 潘军杰 2017-02-28
 *
 */
public class HikariCPPlugin implements IPlugin, IDataSourceProvider {
    // 数据库连接字符串
    private String jdbcUrl;
    // 数据库用户名
    private String username;
    // 数据库连接密码
    private String password;
    // 数据库驱动类名
    private String driverClassName = null;

    // 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
    private int maxPoolSize = 10;
    // 一个连接 idle 状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
    private long idleTimeoutMs = 600000;
    // 最小空闲数 默认 10
    private int minIdle = 10;
    // 一个连接的生命时长(毫秒),超时且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考 MySQL
    // wait_timeout 参数(show variables like '%timeout%';)
    private long maxLifetimeMs = 1800000;
    // 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生 SQLException, 缺省:30秒
    private long connectionTimeoutMs = 30000;

    /**
     * hsqldb:"select 1 from INFORMATION_SCHEMA.SYSTEM_USERS" Oracle:"select 1
     * from dual" DB2:"select 1 from sysibm.sysdummy1" mysql:"select 1"
     */
    private String connectionTestQuery = "select 1";

    private HikariDataSource ds;
    private boolean isStarted = false;

    /**
     * 实例化
     * 
     * @param jdbcUrl
     *            数据库连接字符串
     *            如:jdbcUrl=jdbc:mysql://localhost:3306/dbname?useUnicode=true&autoReconnect=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=false
     * @param username
     *            数据库连接用户名
     * @param password
     *            数据库连接密码
     */
    public HikariCPPlugin(String jdbcUrl, String username, String password) {
    this.jdbcUrl = jdbcUrl;
    this.username = username;
    this.password = password;
    }

    @Override
    public boolean start() {
    if (isStarted) {
        return true;
    }

    ds = new HikariDataSource();

    ds.setJdbcUrl(jdbcUrl);
    ds.setUsername(username);
    ds.setPassword(password);

    ds.setDriverClassName(driverClassName);

    ds.setConnectionTestQuery(connectionTestQuery);
    ds.setConnectionTimeout(connectionTimeoutMs);

    ds.setIdleTimeout(idleTimeoutMs);
    ds.setMaxLifetime(maxLifetimeMs);
    ds.setMaximumPoolSize(maxPoolSize);
    ds.setMinimumIdle(minIdle);

    isStarted = true;
    return true;
    }

    @Override
    public boolean stop() {
    if (ds != null) {
        ds.close();
    }

    ds = null;
    isStarted = false;
    return true;
    }

    @Override
    public DataSource getDataSource() {
    return ds;
    }

    /**
     * 设置额外的关键参数
     * 
     * @param idleTimeoutMs
     *            单位毫秒 默认 600000 毫秒
     * @param maxLifetimeMs
     *            单位毫秒 默认 1800000 毫秒
     * @param maxPoolSize
     *            最大连接池数 默认 10 个
     * @param minIdle
     *            最小空闲数 默认 10 个
     * @return
     */
    public HikariCPPlugin set(long idleTimeoutMs, int maxLifetimeMs, int maxPoolSize, int minIdle) {
    this.idleTimeoutMs = idleTimeoutMs;
    this.maxLifetimeMs = maxLifetimeMs;
    this.maxPoolSize = maxPoolSize;
    this.minIdle = minIdle;
    return this;
    }

    /**
     * 设置数据库连接驱动类名
     * 
     * @param driverClassName
     * @return
     */
    public HikariCPPlugin setDriverClass(String driverClassName) {
    this.driverClassName = driverClassName;
    return this;
    }

    /**
     * 设置一个连接 idle 状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
     * 
     * @param idleTimeoutMs
     * @return
     */
    public HikariCPPlugin setIdleTimeoutMs(long idleTimeoutMs) {
    this.idleTimeoutMs = idleTimeoutMs;
    return this;
    }

    /**
     * 设置一个连接的生命时长(毫秒),超时且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考 MySQL
     * wait_timeout 参数(show variables like '%timeout%';)
     * 
     * @param maxLifetimeMs
     * @return
     */
    public HikariCPPlugin setMaxLifetimeMs(int maxLifetimeMs) {
    this.maxLifetimeMs = maxLifetimeMs;
    return this;
    }

    /**
     * 设置连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
     * 
     * @param maxPoolSize
     * @return
     */
    public HikariCPPlugin setMaxPoolSize(int maxPoolSize) {
    this.maxPoolSize = maxPoolSize;
    return this;
    }

    /**
     * 设置最小空闲数 默认 10
     * 
     * @param minIdle
     * @return
     */
    public HikariCPPlugin setMinIdle(int minIdle) {
    this.minIdle = minIdle;
    return this;
    }

    /**
     * 设置连接测试查询
     * 
     * @param connectionTestQuery
     * @return
     */
    public HikariCPPlugin setConnectionTestQuery(String connectionTestQuery) {
    this.connectionTestQuery = connectionTestQuery;
    return this;
    }
}

使用方法,在 JFinal 配置文件中,配置插件,你懂的:

/**
 * 配置插件
*/
@Override
public void configPlugin(Plugins me) {
    HikariCPPlugin mysqlPool = new HikariCPPlugin(PropKit.get("jdbcUrl"),PropKit.get("user"),PropKit.get("password"));
    me.add(mysqlPool);

    // mysql ActiveRecrodPlugin 实例,并指定configName为 mysql
    ActiveRecordPlugin arpMysql = new ActiveRecordPlugin("mysql", mysqlPool);
    me.add(arpMysql);

    // 所有配置在 MappingKit 中搞定
   _MappingKit.mapping(arpMysql);
   ...
}
上一篇下一篇

猜你喜欢

热点阅读