数据库连接池c3p0和Druid使用教程

Posted 花伤情犹在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池c3p0和Druid使用教程相关的知识,希望对你有一定的参考价值。

前言

本文将介绍数据库连接池:c3p0和Druid使用教程

数据库连接池:

概念:其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

好处:

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

实现:

  • 标准接口:DataSource javax.sql包下的

方法:

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

一般我们不去实现它,有数据库厂商来实现 C3P0:数据库连接池技术 Druid:数据库连接池实现技术,由阿里巴巴提供的

C3P0:数据库连接池技术

C3P0官方文档-英文不好的可以使用网页:
在这里插入图片描述
步骤:

  • 导入jar包 (两个) c3p0.x.x.x.jarmchange-commons-java-x.x.x.jar
    不要忘记导入数据库驱动jar包
  • 定义配置文件:
    名称c3p0.properties 或者 c3p0-config.xml
    路径:直接将文件放在src目录下即可,C3P0会对c3p0.properties或者对c3p0-config.xml进行自动解析的。
    创建核心对象:数据库连接池对象 ComboPooledDataSource
    获取连接getConnection

代码:

 //1.创建数据库连接池对象
DataSource ds  = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();

关于C3P0的配置:

c3p0的配置方式分为三种,分别是:

  1. setters一个个地设置各个配置项(不推荐)
  2. 类路径下提供一个c3p0.properties文件
  3. 类路径下提供一个c3p0-config.xml文件

通过硬编码方式使用set方法一个个地设置各个配置项:

public static void main(String[] args) {
	ComboPooledDataSource comboPooledDataSource = null;
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        // 创建 ComboPooledDataSource 对象,该对象间接实现了 java 官方提供的 DataSource 接口
        comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/lcz");
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setPassword("root");
        // 设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(20);
        // 设置最小连接数,当连接池还有2个的时候,就开始申请连接数
        comboPooledDataSource.setMinPoolSize(2);
        // 设置最大连接数,最多只能有 40 个连接
        comboPooledDataSource.setMaxPoolSize(40);
        // 当连接数不够用时,一次向数据库申请多少个连接
        comboPooledDataSource.setAcquireIncrement(5);
        // 只是对连接做了优化,剩下的操作不变
        String sql = "select * from user";
        connection = comboPooledDataSource.getConnection();
        preparedStatement = connection.prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            Integer id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            Integer age = resultSet.getInt("age");
            System.out.println(id + name + age);
        }
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    } catch (SQLException e){
        e.printStackTrace();
    } finally {
        try {
            resultSet.close();
            preparedStatement.close();
            // 这里并不是把连接关闭了,而是释放到连接池里,等待下一次继续使用
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

c3p0.properties文件:

c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/lcz
c3p0.user=root
c3p0.password=root
c3p0.maxPoolSize=20
c3p0.minPoolSize=3
c3p0.maxStatements=30
c3p0.maxIdleTime=150

参数详解:

#数据库驱动名称
c3p0.driverClass=com.mysql.cj.jdbc.Driver

#数据库连接地址
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/lcz

#数据库用户名
c3p0.user=root

#数据库密码
c3p0.password=root

#连接池中保留的最大连接数。默认值: 15
c3p0.maxPoolSize=20

#连接池中保留的最小连接数,默认为:3
c3p0.minPoolSize=3

#c3p0全局的PreparedStatements缓存的大小。
c3p0.maxStatements=30

#最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0
c3p0.maxIdleTime=150

c3p0-config.xml文件:

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 也可以添加多个配置 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/lcz</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>
</c3p0-config>

Druid数据库连接池实现技术(阿里巴巴提供)

Alibaba-Druid-Github

  • 步骤:
    1. 导入jar包 druid-x.x.x.jar
    2. 定义配置文件:
    * 是properties形式的
    * 可以叫任意名称,可以放在任意目录下
    3. 加载配置文件。Properties
    4. 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
    5. 获取连接:getConnection

代码:

//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();

Druid配置文件:

# 数据库驱动名称
driverClassName=com.mysql.cj.jdbc.Driver
# 数据库连接地址
url=jdbc:mysql://localhost:3306/lcz
# 数据库用户名
username=root
# 数据库密码
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

以上是关于数据库连接池c3p0和Druid使用教程的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据库连接池C3P0,德鲁伊(Druid)的详解

Java 数据库连接池C3P0,德鲁伊(Druid)的详解

数据库连接池 Druid和C3p0

数据库连接池 Druid和C3p0

数据库连接池的使用(c3p0,Druid)

了解c3p0,dbcp与druid