前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java——数据库编程JDBC之数据库连接池技术(C3P0与Druid,提供了Druid的工具类)

Java——数据库编程JDBC之数据库连接池技术(C3P0与Druid,提供了Druid的工具类)

作者头像
Winter_world
发布2020-09-25 11:04:27
9180
发布2020-09-25 11:04:27
举报
文章被收录于专栏:技术小屋-未分类

上篇博文中讲解的JDBC,程序中每次都要获取数据库连接,使用完毕后直接释放资源,实际上这种在实际应用中是不可取的,因为效率很低,所以,本文来总结下数据库连接池技术。

1 数据库连接池概念

数据库连接池就是一个存放数据库连接的容器(集合),当系统初始化后容器被创建,容器会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用户访问完后会将连接对象归还给容器。使用连接池的好处

  • 节约资源;
  • 用户访问高效。

2 数据库连接池的实现

在javax.sql包下有一个标准接口DataSource,两个方法:

  • 获取连接:getConnection();
  • 归还连接:Connection.close(),若连接对象是从连接池中获取的,那么调用方法时不会再关闭连接,而是归还连接。

一般不需要用户实现,由数据库厂商实现。本文讲解两种不同的数据库连接池技术实现:

  • C3P0:数据库连接池技术(较老);
  • Druid:数据库连接池技术,性能较高,应用较广泛,由阿里巴巴提供的。

3 C3P0数据库连接池技术

3.1 使用步骤

  • 1)导入两个jar包:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar(注意:另外别忘了数据库的驱动jar包);
  • 2)定义配置文件,名称必须为c3p0.properties 或者 c3p0-config.xml,文件直接放在src目录下;
  • 3)创建数据库连接池对象ComboPooledDataSource;
  • 4)获取连接:getConnection()。

【举例】:基本使用案例如下:

3.2 配置文件

c3p0-config.xml配置文件中包含了default-config默认的配置和named-config name="otherc3p0"自定义的配置,在创建数据库连接对象时,没有参数时使用默认的配置,有参数时使用指定的配置。

【配置文件c3p0-config.xml】:源码见下,有具体注释,不再赘述

代码语言:javascript
复制
<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <!-- 初始化申请的连接数量   -->
    <property name="initialPoolSize">5</property>
    <!-- 最大的连接数量,超过这个数量后会报错   -->
    <property name="maxPoolSize">10</property>
    <!-- 超时时间   -->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>

如下的demo演示了获取最大连接数量及归还连接的操作:

代码语言:javascript
复制
public class C3p0Demo1 {
    public static void main(String[] args) throws SQLException {
        //1、创建数据库连接对象,使用默认配置
        // 使用指定名称的配置
//        DataSource ds = new ComboPooledDataSource("otherc3p0");
        DataSource ds = new ComboPooledDataSource();
        //2、获取连接对象
        for (int i = 0; i < 11; i++) {  //演示获取最大连接数量
            Connection conn = ds.getConnection();
            System.out.println(i+":"+conn);
            if(i == 5){
                conn.close(); //归还连接
            }
        }
    }
}

4 Druid数据库连接池技术

PS:由阿里巴巴提供,应用非常广泛,我们实际做项目时推荐使用。

4.1 使用步骤

  • 1)导入jar包:druid-1.0.9.jar(注意:另外别忘了数据库的驱动jar包);
  • 2)定义配置文件:properties文件形式,可以定义为任意名称,可放在任意目录下,需要手动加载至工程中;
  • 3)加载配置文件:Properties;
  • 4)获取数据库连接池对象:通过工厂类DruidDataSourceFactory.createDataSource()获取;
  • 5)获取连接:getConnection()。

【举例】:基本使用案例如下

代码语言:javascript
复制
public class DruidDemo1 {
    public static void main(String[] args) throws Exception {
        //1、导入jar包
        //2、定义配置文件
        //3、加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        //4、获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //5、获取连接
        Connection connection = ds.getConnection();
        System.out.println(connection);
    }
}

4.2 Druid工具类

我们使用Druid数据库连接池技术,为了方便使用,可以对其常用的操作进行封装,形成一个工具JdbcUtils工具类:

1)要有静态代码块,加载配置文件,初始化连接池对象;

2)提供几种方法:

  • 获取连接方法:通过数据库连接池获取;
  • 释放资源;
  • 获取连接池的方法;

【Druid 的工具类】:

代码语言:javascript
复制
//Druid数据库连接池的工具类
public class JdbcUtils {

    //1、定义成员变量DataSource
    private static DataSource ds;

    static {
        try {
            // 1、加载配置文件
            Properties pro = new Properties();
            pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2、获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    //释放资源
    public static void close(Statement stmt,Connection conn){
        close(stmt,conn,null);
    }

    public static void close(Statement stmt, Connection conn, ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close(); //归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    //获取连接池
    public static DataSource getDataSource(){
        return ds;
    }
}

【举例】:使用JdbcUtils工具类插入一条数据

代码语言:javascript
复制
public class DruidDemo2 {
    public static void main(String[] args) {
        //完成添加操作,在db1 的account表中添加一条记录
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            //1、获取连接
            conn = JdbcUtils.getConnection();
            //2、定义sql
            String sql = "insert into account values(null,?,?)";
            //3、获取pstmt对象
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,"wangwu");
            pstmt.setDouble(2,100);
            int cnt = pstmt.executeUpdate();
            System.out.println(cnt);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(pstmt,conn);
        }
    }
}

———————————————————————————————————————

本文为博主原创文章,转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 数据库连接池概念
  • 2 数据库连接池的实现
  • 3 C3P0数据库连接池技术
    • 3.1 使用步骤
      • 3.2 配置文件
      • 4 Druid数据库连接池技术
        • 4.1 使用步骤
          • 4.2 Druid工具类
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档