基于Druid编写JDBC连接池

5 篇文章 0 订阅

JDBC连接池

package com.bigdata.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;
import java.util.Properties;

/**
 * @Author: xxx
 * @Date: 2020/10/28 16:40
 * @Description: JDBC 配置Druid连接池
 *
 * <p>
 * 1. 定义一个类 JDBC 工具类
 * 2. 提供静态代码块加载配置文件, 初始化连接池对象
 * 3. 提供方法
 * (1). 获取连接方法:通过数据库连接池获取连接
 * (2). 释放资源
 * (3). 获取连接池的方法
 * </p>
 *
 * <p>
 * NOTE Idea中maven项目druid连接池加载druid.properties文件时报NullPointerException: inStream parameter is null异常
 * 使用的是maven来编写, 所以在工具类中, 要将"/"去掉, 它加载的就不是classes中的
 * 在maven项目中, 使用工具类来加载的, 但是有"/"的话, 它就会去根路径下去找, 并不会加载到
 * </p>
 */
public class JdbcDataSourceUtil {
    /**
     * 创建成员变量
     */
    private static DataSource ds;
    private static Properties prop;
    private static InputStream inputStream;

    /**
     * NOTE 使用volatile关键字, 可以保证多线程下的可见性
     */
    private volatile static JdbcDataSourceUtil instance;

    /**
     * 工具类, 私有化无参构造函数
     */
    private JdbcDataSourceUtil() {
    }

    /**
     * 加载的代码写在静态代码块中
     */
    static {
        //创建Properties
        prop = new Properties();
        try {
            //1.加载properties文件
            inputStream = JdbcDataSourceUtil.class.getClassLoader().getResourceAsStream("mysql.properties");
            //2.加载输入流
            prop.load(inputStream);
            //3.加载数据源
            ds = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 用简单单例模式确保只返回一个链接对象
     *
     * @return instance
     */
    public static JdbcDataSourceUtil getInstance() {
        if (instance == null) {
            synchronized (JdbcDataSourceUtil.class) {
                if (instance == null) {
                    instance = new JdbcDataSourceUtil();
                }
            }
        }
        return instance;
    }

    /**
     * 获取到数据源
     */
    private static DataSource getDataSource() {
        return ds;
    }

    /**
     * 获取连接对象, 默认: MySQL JDBC
     *
     * @return Connection
     */
    public static Connection getJdbcConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取连接对象
     *
     * @param dataSourceType 数据源类型
     * @return Connection    Connection
     * @throws SQLException SQLException
     * @Description: <p>
     * 当调用 JdbcDataSourceUtil.getJdbcConnection() 方法时, 有以下几种形式:
     * JdbcDataSourceUtil.getJdbcConnection(["mysql"]) 方法时, 默认: MySQL JDBC
     * JdbcDataSourceUtil.getJdbcConnection("hive") 方法时, JDBC类型: Hive JDBC
     * JdbcDataSourceUtil.getJdbcConnection("impala") 方法时, JDBC类型: Impala JDBC
     * </p>
     */
    public static Connection getJdbcConnection(String dataSourceType) throws SQLException {
        //加载配置文件
        prop = new Properties();
        try {
            switch (dataSourceType) {
                case "mysql":
                    inputStream = JdbcDataSourceUtil.class.getClassLoader().getResourceAsStream("mysql.properties");
                    prop.load(inputStream);
                    ds = DruidDataSourceFactory.createDataSource(prop);
                    System.out.println("数据源类型: MySQL");
                    break;
                case "hive":
                    inputStream = JdbcDataSourceUtil.class.getClassLoader().getResourceAsStream("hive.properties");
                    prop.load(inputStream);
                    ds = DruidDataSourceFactory.createDataSource(prop);
                    System.out.println("数据源类型: Hive");
                    break;
                case "impala":
                    inputStream = JdbcDataSourceUtil.class.getClassLoader().getResourceAsStream("impala.properties");
                    prop.load(inputStream);
                    ds = DruidDataSourceFactory.createDataSource(prop);
                    System.out.println("数据源类型: Impala");
                    break;
                default:
                    System.out.println("不能匹配的数据源类型: " + dataSourceType);
                    break;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ds.getConnection();
    }

    /**
     * 释放资源
     *
     * @param conn Connection
     * @param ps   PreparedStatement
     * @param rs   ResultSet
     */
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     *
     * @param conn Connection
     * @param ps   PreparedStatement
     */
    public static void close(Connection conn, PreparedStatement ps) {
        close(conn, ps, null);
    }

    /**
     * 释放资源
     *
     * @param conn Connection
     * @param rs   ResultSet
     */
    public static void close(Connection conn, ResultSet rs) {
        close(conn, null, rs);
    }

}

Resources

  • mysql.properties
# 配置数据库的连接参数
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://hadoop001:3306/xxxdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username=xxxxxx
password=xxxxxx

# 配置连接池的参数
initialSize=5
maxActive=10
maxWait=3000
#maxIdle=6
#minIdle=3
  • hive.properties
# 配置数据库的连接参数
driverClassName=org.apache.hive.jdbc.HiveDriver
url=jdbc:hive2://hadoop001:10000/test
username=hive
password=hive
  • impala.properties
# 配置数据库的连接参数
# Impala使用Hive JDBC
driverClassName=org.apache.hive.jdbc.HiveDriver
url=jdbc:hive2://hadoop002:21050/xxxdb;auth=noSasl
username=hive
password=hive

## 配置数据库的连接参数
## Impala使用Impala JDBC
#driverClassName=com.cloudera.impala.jdbc41.Driver
#url=jdbc:impala://hadoop002:21050/
#username=
#password=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值