JDBC与数据库连接池(Druid-德鲁伊)的简单使用

1 篇文章 0 订阅
1 篇文章 0 订阅

1. 导语

Druid德鲁伊是阿里巴巴出品的一个数据库连接池,结合了DBCP、C3P0、PROXOOL等数据库连接池的优点,同时添加了日志监控功能,可以很好的监控D数据库连接池和SQL的执行情况,可以说是市场上目前性价比超高、超好用的数据库连接池。作为国人,我们应为之感到骄傲。

使用连接池,在编码上,仅仅是改变了Java程序连接数据库这一连接部分,之前是JDBC直连数据库,且运行一次程序就连接一次数据库,最重要的,每次连接数据库,就要耗费较多资源,拿钱做比喻的话,就是很烧钱!!!

程序员和资本家们,当然不能这样搞烧钱的事。

你还别说,一群比较有头脑的人,发明了一种东西—数据库连接池。

简而言之,数据库连接池出现的原因,就是为了避免烧钱。

2. 使用数据库连接池好处

但这里还是有必要说一下,数据库连接池的好处:

  1. 连接资源重用
  2. 系统的响应速度更快
  3. 属于一种新的资源分配的手段(以前我们是从数据库服务器直接获取连接实现交互。现在我们只需要从连接池中拿连接,用完了,再放回连接池即可,而不必大费周章的去直接连接数据库)
  4. 避免服务器(一言不合就)宕机(——“不好了,老板,服务器挂了,已经有很多用户再投诉了!!!” ——“扣你工资!”)

上面已经提到,数据库连接池,相比传统直连数据库的程序编写步骤,仅仅在连接数据库方面有区别。

3. 使用步骤

(1)引入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.4</version>
        </dependency>

(2)自己可以根据需要写一个配置文件,这里命名为druid.properties

driverClassName = com.mysql.cj.jdbc.Driver
url=jdbc:mysql://...
username=root
password=root
#初始化时建立物理连接的个数
initialSize=10
#最大连接池数量
maxActive=20
#获取连接时最大等待时间
maxWait=10000

参考地址:

https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

(3)使用连接池操作数据库,这里使用单例模式来创建,只创建一个druid数据库连接池

public class JDBCUtils {

    private static JDBCUtils instance;

    DataSource dataSource;

    static {
        instance = new JDBCUtils();
    }

    public static JDBCUtils getInstance(){
        return instance;
    }
    /*
     * 读取配置文件
     * */
    private JDBCUtils() {
        //数据源配置
        Properties prop = new Properties();
        //读取配置文件
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            prop.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            //返回的是DataSource
            dataSource = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**设置连接*/
    public Connection getConnection() throws Exception{
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    /**关闭资源*/
    public static void closeResoure (Connection conn, PreparedStatement ps){
        try {
            if(ps!=null) {
                ps.close();
            }
        } catch (SQLException throwables) {
            //
            throwables.printStackTrace();
        }
        try {
            if(conn!=null) {
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
   }

4、调用方法

(1)增加

    public static void addElectricCode(ElectricConsumptionCode eCode) throws Exception {
        Connection conn = getInstance().getConnection();
        String sql = "insert into mp_device_electric_consumption_code_statistics_1d values(?,?,?,?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        //填充占位符
        ps.setObject(1,eCode.getElectricId());
        ps.setObject(2,eCode.getYear());
        ps.setObject(3,eCode.getMonth());
        ps.setObject(4,eCode.getDateTime());
        ps.setObject(5,eCode.getRateType());
        ps.setObject(6,eCode.getElectricCode());
        ps.setObject(7,eCode.getCreateTime());
        ps.execute();
        JDBCUtils.closeResoure(conn,ps);
    }

(2)查询

    public static int selectElectricCodeCount(String electricId,  Date date, int rateType) throws Exception {
        Connection conn = getInstance().getConnection();
        String sql = "select count(*) from mp_device_electric_consumption_code_statistics_1d where electric_id = ? and date_time= ? and rate_type = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        //填充占位符
        ps.setObject(1,electricId);
        ps.setObject(2,date);
        ps.setObject(3,rateType);
        ResultSet rs = ps.executeQuery();
        int count = 0;
        while (rs.next()){
            count = rs.getInt(1);
        }
        JDBCUtils.closeResoure(conn,ps);
        return count;
    }

(3)更新

    public static void updateElectric(String electricId,  Date date, int rateType, double electricValue) throws Exception {
        Connection conn = getInstance().getConnection();
        String sql = "update mp_device_electric_consumption_statistics_1d set electric = ? where electric_id = ? and date_time= ? and rate_type = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        //填充占位符
        ps.setObject(1,electricValue);
        ps.setObject(2,electricId);
        ps.setObject(3,date);
        ps.setObject(4,rateType);
        ps.execute();
        JDBCUtils.closeResoure(conn,ps);
    }

参考:
https://blog.csdn.net/QQQZSJ/article/details/107217043?spm=1001.2014.3001.5506

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值