数据库开发四:JDBC数据库开发进阶二(连接池)
程序员文章站
2022-05-28 11:09:41
...
文章相关视频出处: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>
上一篇: 数据库开发三:JDBC数据库开发入门三