欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库开发四:JDBC数据库开发进阶二(连接池)

程序员文章站 2022-05-28 11:09:41
...

文章相关视频出处:https://developer.aliyun.com/lesson_1698_13623#_13623

目录

连接池

dbcp

c3p0


连接池

需求:
    使用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.
技术分析:
    连接池
连接池概述:
    管理数据库的连接,
    作用:
        提高项目的性能.
    就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
    所有的连接池必须实现一个接口 javax.sql.DataSource接口

dbcp

连接池必须实现:javax.sql.DataSource接口
连接池返回的Connection对象,它的close()方法与众不同,调用它的close()不是关闭,而是把连接归还给池
jdbc连接Connection类名com.mysql.cj.jdbc.ConnectionImpl
dbcp连接池Connection类名org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper
连接池内部是使用mysql驱动提供的Connection
连接池使用mysql连接对象进行了装饰,只对close()方法进行了增强
装饰之后的Connection的close()方法,用来把当前连接归还给池

代码实现

package dbcp;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * DBCP 连接池
 * Created by kevin on 2020/3/26.
 */
public class Demo1 {
    private static Properties properties = null;
    static {
        try {
            InputStream in = Demo1.class.getClassLoader().getResourceAsStream("dbconfig.properties");
            properties = new Properties();
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void fun1(){
        /**
         * 1、创建连接池对象
         * 2、配置4大参数(驱动类,url,name,password)
         * 3、配置池参数
         * 4、得到连接对象
         */
        //1、创建连接池对象
        BasicDataSource basicDataSource = new BasicDataSource();
        //2、配置4大参数(驱动类,url,name,password)
        basicDataSource.setDriverClassName(properties.getProperty("driverClassName"));
        basicDataSource.setUrl(properties.getProperty("url"));
        basicDataSource.setUsername(properties.getProperty("name"));
        basicDataSource.setPassword(properties.getProperty("password"));
        //3、配置连接池参数
        basicDataSource.setMaxTotal(20);
        basicDataSource.setMinIdle(3);
        basicDataSource.setMaxWaitMillis(1000);
        //4、得到连接池对象
        try {
            Connection connection = basicDataSource.getConnection();
            System.out.println(connection.getClass().getName());
            /**
             * 连接池内部是使用mysql驱动提供的Connection
             * 连接池使用mysql连接对象进行了装饰,只对close()方法进行了增强
             * 装饰之后的Connection的close()方法,用来把当前连接归还给池
             */
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

c3p0

c3p0中池类是:ComboPooledDataSource
c3p0和星球大战一个礼仪机器人名字相同哦
连接
底层使用的动态代理不是装饰者模式
c3p0连接池Connection类名com.mchange.v2.c3p0.impl.NewProxyConnection
c3p0连接的配置文件使用
·文件名称必须交c3p0-config.xml
·文件位置必须在src下
c3p0连接过程出现的错误记录
 问题1:对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾。
 解决:特殊字符需要用转义字符比如'&'替换成'&amp';

代码实现

package c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Test;

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * c3p0 连接池
 * Created by kevin on 2020/3/26.
 */
public class Demo1 {
    private static Properties properties = null;
    static {
        try {
            InputStream in = Demo1.class.getClassLoader().getResourceAsStream("dbconfig.properties");
            properties = new Properties();
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 代码配置
     */
    @Test
    public void fun1(){
        try {
            /**
             * 1、创建连接池对象
             * 2、配置4大参数(驱动类,url,name,password)
             * 3、配置池参数
             * 4、得到连接对象
             */
            //1、创建连接池对象
            ComboPooledDataSource comboPooledDataSource  = new ComboPooledDataSource();
            //2、配置4大参数(驱动类,url,name,password)
            comboPooledDataSource.setDriverClass(properties.getProperty("driverClassName"));
            comboPooledDataSource.setJdbcUrl(properties.getProperty("url"));
            comboPooledDataSource.setUser(properties.getProperty("name"));
            comboPooledDataSource.setPassword(properties.getProperty("password"));
            //3、配置连接池参数
            comboPooledDataSource.setAcquireIncrement(5);
            comboPooledDataSource.setInitialPoolSize(20);
            comboPooledDataSource.setMinPoolSize(2);
            comboPooledDataSource.setMaxPoolSize(50);
            //4、得到连接池对象
            Connection connection = comboPooledDataSource.getConnection();
            System.out.println(connection.getClass().getName());
            connection.close();
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 配置文件的默认配置
     */
    @Test
    public void fun2(){
        try {
            /**
             * 在创建连接池对象时,这个对象就会自动加载配置文件!
             */
            //默认配置 default-config
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            //命名配置 named-config
            //ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("myConfig");
            Connection connection = comboPooledDataSource.getConnection();
            System.out.println(connection.getClass().getName());
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

c3p0-config.xml

<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>
    <!--默认使用default-config配置-->
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf-8</property>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">mysql</property>

        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">50</property>
        <property name="minPoolSize">10</property>
    </default-config>
    <!--命名配置named-config-->
    <!--<named-config name="myConfig">-->
        <!--<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf-8</property>-->
        <!--<property name="driverClass">com.mysql.cj.jdbc.Driver</property>-->
        <!--<property name="user">root</property>-->
        <!--<property name="password">mysql</property>-->
        <!--<property name="initialPoolSize">10</property>-->
        <!--<property name="maxIdleTime">30</property>-->
        <!--<property name="maxPoolSize">50</property>-->
        <!--<property name="minPoolSize">10</property>-->
    <!--</named-config>-->
</c3p0-config>

 

相关标签: 数据库开发