回顾JDBC开发流程
- 加载驱动(只需要一次)
- 建立数据库连接(拿到Connection)
- 执行SQL语句(Statement)
- Resultset接收结果集(查询)
- 断开连接,释放资源
数据库连接对象是通过DriverManager来获取的,每次获取都要向数据库申请获取连接,验证用户名和密码,执行完SQL语句后断开连接。这非常的浪费资源,资源利用率很低,复用性低。(想打电话,买了个手机,打完电话就扔了)
那咋办嘛???
概述
-
背景:解决上述问题(用完扔掉——>用完还回连接池)
-
本质:为数据库建立一个Connection缓冲池,预先向缓冲池中放入一定数量的连接对象,当需要获取数据库连接时,只要从池子里拿一个出来就好,用完后放回池子。(买n部电话,大家合着用)
-
作用:提高效率,资源得以重复利用,避免重复创建
-
当连接池中没有空闲连接时,多的请求进入等待队列
实现
-
JDBC的数据库连接池使用javax.sql.DataSource接口来完成的(DataSource是官方提供的接口,使用的时候开发者不需要自己来实现接口,可以使用第三方工具,C3P0就是一个常用的第三方实现,实际开发中直接使用C3P0即可)
-
步骤
- 导入jar包
- c3p0
- mchange-commons-java
- 创建c3p0
- 和JDBC一样配置连接信息
- 获取连接对象
com.mchange.v2.c3p0.impl.NewProxyConnection@2d6d8735 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@ba4d54]
- 处理
- close(),把连接对象还给连接池(这里不是释放资源)
- 导入jar包
-
代码
package com.microsoft.jdbc;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
public class DataSourceTest {
public static void main(String[] args) {
try {
// 创建c3p0
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 配置连接信息
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=UTF-8");
dataSource.setUser("root");
dataSource.setPassword("admin");
Connection connection = dataSource.getConnection();
//System.out.println(connection);
// 还回到数据库连接池
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
常用方法
// 设置初始化连接个数
dataSource.setInitialPoolSize(20);
// 设置连接池最大连接数(线程数不够再拿)
dataSource.setMaxPoolSize(40);
// 连接对象不够的时候,再次申请的个数
dataSource.setAcquireIncrement(5);
// 设置连接池最小连接数(比如这里只剩2个就要再去申请)
dataSource.setMinPoolSize(2);
关于配置
- 尽量少改源码,数据不要写死,否则效率很低,每次改完还要再次编译
- 解决方案——用配置文件xml,改配置即可,大大提升效率
简化后的java文件
package com.microsoft.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.*;
public class JDBCTools {
private static DataSource dataSource;
static {
dataSource = new ComboPooledDataSource("testc3p0");
}
public static Connection getConnection(){
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void release(Connection connection, Statement statement, ResultSet resultSet){
try {
if (resultSet != null) {
resultSet.close();
}
if(statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
自己新建一个配置文件c3p0-config.xml
(注意符号’&'要写& amp;)
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<named-config name="testc3p0">
<!-- 指定数据库连接源的基本属性 -->
<property name="user">root</property>
<property name="password">admin</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=UTF-8</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">40</property>
</named-config>
</c3p0-config>
- 常见错误
- 文件名一定是
c3p0-config.xml
- 初始化ComboPooledDataSource时,传入的参数一定是xml中中的name属性值
- 配置文件直接放在
src
下就行了(与包同级)
- 文件名一定是