1. 什么是连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个新的连接。
2. 为什么要使用连接池?
- 新建连接(不用连接池)
- 步骤
- TCP建立的三次握手
- MYSQL认证的三次握手
- SQL执行
- 连接的关闭
- TCP的四次挥手
- 缺点
- 每一次都要经过以上步骤
- 网络IO多
- 数据库的负载较高
- GC频繁
- 步骤
- 使用连接池
- 优点
- 第一次访问的时候,需要建立连接。 之后的访问,会复用之前创建的连接
- 减少了网络的IO
- 优点
3. 连接池的主要参数
- 最小连接数
- 最大连接数
- 作用
- 同一时刻可以同时向数据库申请的连接数
- 作用
- 初始连接数
- 作用
- 连接池的初始连接数的大小
- 作用
- 最小空闲数
- 作用
- 池中空闲连接的最小数量 在数据库连接池空闲状态下,连接池最少保留多少个连接
- 特点
- 当连接数少于此值时,连接池会创建连接来补充到该值的数量
- 作用
- 最大超时时间
4. 使用
-
DBCP
- pom 引入
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>
- 上实操代码~~~
import org.apache.commons.dbcp.BasicDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; /** * @Classname BasicDataSourceTest * @Description TODO org.apache.commons.dbcp.BasicDataSource 连接池 * @Date 2020/7/9 8:42 * @Created by light */ public class BasicDataSourceTest { public static void main(String[] args) { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/scott"); dataSource.setUsername("root"); dataSource.setPassword("123456"); // 设置连接池的初始连接数的大小 dataSource.setInitialSize(3); // 设置最大的连接数 同一时刻可以同时向数据库申请的连接数 dataSource.setMaxActive(10); //设置池中空闲连接的最小数量 在数据库连接池空闲状态下,连接池最少保留多少个连接 dataSource.setMinIdle(2); for (int i = 0; i < 20; i++) { new Thread(new DataSourceThread(dataSource)).start(); } } } /** * 用于测试 连接池的 最大连接数 */ class DataSourceThread implements Runnable { private DataSource dataSource; public DataSourceThread(DataSource dataSource) { this.dataSource = dataSource; } @Override public void run() { Connection connection = null; try { connection = dataSource.getConnection(); System.out.println(Thread.currentThread().getName() + " 获得数据库连接 " + connection); Thread.sleep(10000); } catch (Exception throwables) { throwables.printStackTrace(); } finally { if (connection != null) { try { // 只有当前面的线程释放到连接资源后,新的线程才能获取连接资源 //此处的 close 不是关闭,而是归池 如果不归池,那么其他线程就获取不到连接 connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }
- pom 引入
-
c3p0
- pom
<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency>
- 上Java~~~
import com.mchange.v2.c3p0.ComboPooledDataSource; /** * @Classname MyC3p0DataSourceTest * @Description TODO c3p0 连接池的使用 * @Date 2020/7/9 11:57 * @Created by light */ public class MyC3p0DataSourceTest { public static void main(String[] args) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scott"); dataSource.setUser("root"); dataSource.setPassword("123456"); // 初始连接数 池在启动时将尝试获取的连接数。应该在minPoolSize和 maxPoolSize之间, dataSource.setInitialPoolSize(3); // 最大连接数 dataSource.setMaxPoolSize(10); // 最小连接数 dataSource.setMinPoolSize(2); // 最大空闲时间 单位为 S dataSource.setMaxIdleTime(60); System.out.println(dataSource.getConnection()); } }
- pom