HikariCP连接池(无框架)
2020-09-14 15:37:31
41次阅读
0个评论
package cn.com.muzili.sm.core.common;

import java.io.File;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import cn.com.muzili.sm.core.common.ds.Datasource;
import cn.com.muzili.sm.core.common.ds.Datasources;

public class HikariUtil {

    private static Logger logger = LoggerFactory.getLogger(HikariUtil.class);
    private final static String DATA_SOURCE_FILE = "monitor_ds.xml";

    // 多数据源的存储对象
    private static Map<String, DataSource> dsCache = new HashMap<String, DataSource>();

    static {
        initDataSource();
    }

    /**
     * 初始化
     */
    private static void initDataSource() {
        URL url = Thread.currentThread().getContextClassLoader().getResource(DATA_SOURCE_FILE);
        if (url != null) {
            File file = new File(url.getFile());
            if (file.exists()) {
                Datasources dsList = XmlUtil.loadXml(file, Datasources.class);
                if (dsList != null) {
                    for (Datasource ds : dsList.getDatasource()) {
                        createDataSource(ds);
                    }
                }
            }
        } else {
            logger.error("找不到DataSource定义文件:" + DATA_SOURCE_FILE);
        }
    }

    /**
     * 初始化数据库连接池
     *
     * @param DataSource 待初始化的数据库信息
     */
    private static void createDataSource(Datasource xmlDs) {

        HikariConfig config = new HikariConfig();
        // 数据库驱动|不填写HikariCp会自动识别
        config.setDriverClassName(xmlDs.getDriver());
        // 访问数据库连接
        config.setJdbcUrl(xmlDs.getUrl());
        // 数据库用户名
        config.setUsername(xmlDs.getUser());
        // 数据库密码
        config.setPassword(xmlDs.getPassword());
        // 最大连接数
        config.setMaximumPoolSize(3);
        // 连接池空闲连接的最小数量
        config.setMinimumIdle(3);

        try {
            DataSource hds = new HikariDataSource(config);
            dsCache.put(xmlDs.getName(), hds);
        } catch (Exception e) {
            logger.error("初始化创建连接池失败!" + e.toString());
        }
    }

    /**
     * 获取所有连接配置
     * 
     * @return
     */
    public static Map<String, DataSource> getDatasources() {
        return dsCache;
    }

    /**
     * 获取数据库的连接
     *
     * @param dsName 数据源名称
     * @return 获取数据库连接
     * @throws SQLException
     */
    public static Connection getConnection(String dsName) throws SQLException {
        DataSource source = dsCache.get(dsName);
        return source.getConnection();
    }

    /**
     * 数据库连接关闭
     * @param conn
     */
    public static void destroy(Connection conn) {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            logger.error(e.toString(), e);
        }
    }
}
收藏 0 0

登录 后评论。没有帐号? 注册 一个。

程序猿

  • 0 回答
  • 0 粉丝
  • 0 关注