文章相關視頻出處:https://developer.aliyun.com/lesson_1698_13623#_13623
目錄
連接池
需求:
使用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" 的引用必須以 ';' 分隔符結尾。
解決:特殊字符需要用轉義字符比如'&'替換成'&';
代碼實現
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&useUnicode=true&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&useUnicode=true&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>