数据连接池详解

简述

  数据库连接池本质就是一个容器,存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后会将连接对象归还给容器。使用数据库连接池会节省资源,用户访问也会更加高效。在javax.sql包下有一个DataSource接口哦,各厂商可以实现该接口提供各自的数据库连接池。常用的数据库连接池有C3P0和Druid,顺便一提C3P0名字的由来是星球大战的一个机器人的名字,Druid德鲁伊数据库连接池是由阿里提供的,号称是世界上最好的连接池。

C3P0详解

  使用C3P0之前必须导入它的jar包,或者在maven中添加c3p0的依赖

<dependency>
   <groupId>com.mchange</groupId>
   <artifactId>c3p0</artifactId>
   <version>0.9.5.2</version>
</dependency>    

  若手动导入jar包,我们必须导入c3p0-xxx.jar 和mchange-common-java-xxx.jar两个jar包

  然后我们必须定义数据库连接池的配置文件,我们必须在classpath路径下定义配置文件c3p0.properties或者c3p0-config.xml

<c3p0-config>
    <default-config>

        <!--连接参数-->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
        <property name="user">root</property>
        <property name="password">123456</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.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
        <property name="user">root</property>
        <property name="password">123456</property>

        <!--连接池参数-->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">3000</property>
    </named-config>
</c3p0-config>
简单的配置文件

  连接池就是用来获取连接的,所以我们可以创建连接池对象,然后从连接池对象处获取连接

public static void main(String[] args) throws Exception{
        //1.创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //2.获取连接对象
        Connection connection = ds.getConnection();
}

  需要注意的是,使用连接池获取的连接close会归还连接到连接池中。

  在ComboPooledDataSource()中可以写一个string参数,可以选择xml配置的不同连接配置

Druid详解

  使用德鲁伊连接池也需要导入jar包,druid-xxx.jar

  然后需要在类路径新建任意名称的properties或xml

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
username = root
password = 123456

initialSize = 5
maxActive = 10
maxWait = 3000

  德鲁伊数据库连接池是通过一个工厂类来获取的,然后获取到连接池后才可以获取连接

public static void main(String[] args) throws Exception{
            //1.加载配置文件
            Properties properties = new Properties();
            InputStream is = demo.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);
            //2.获取连接池对象
            DataSource ds = DruidDataSourceFactory.createDataSource(properties);
            //3.获取连接
            Connection connection = ds.getConnection();
            System.out.println(connection);
}

  使用连接池一般我们会搭配自己写的数据库工具类来使用

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    private static DataSource ds;

    static {//使用静态代码块完成DataSource的赋值操作
        try {
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            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(null,stmt,conn);
    }

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

    public static DataSource getDataSource(){
        return ds;
    }

}
配合连接池的工具类

  

  

 

 

 

一点一点积累,一点一点蜕变!
原文地址:https://www.cnblogs.com/qq2210446939/p/14758136.html