數據庫開發四:JDBC數據庫開發進階二(連接池)

文章相關視頻出處: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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章