《连接池&mybatis入门-笔记》
学习目标
- 能够理解连接池解决现状问题的原理
- 能够使用C3P0连接池
- 能够使用DRUID连接池
- 掌握mybatis框架开发快速入门
连接池解决现状问题的原理
目标
- 为什么需要连接池
- 连接池的执行原理
JDBC访问数据库时操作Connection对象
JDBC访问数据库的每个增删改查的操作都需要先创建连接,而且这个连接对象是不能共享的。每个用户每次访问都必须创建一个连接对象,并且这个连接对象应该设置成局部变量。
连接对象的使用问题
- 经过测试,每次访问数据库最耗时的部分就是创建连接对象。
- 每次使用完连接对象以后,就马上关闭。
需要解决两个问题
- 如何提高创建连接对象的速度
- 如何提高连接对象的使用率
使用连接池的目的就是为了解决以上2个问题
连接池的原理图
没有使用连接池的情况:每个用户访问数据库的时候,都是自己创建连接对象
使用连接池的情况:一开始系统启动的时候就创建了一定数量的连接对象,使用的时候直接从连接池中去获取就可以了。不需要自己来创建连接对象。
小结
连接池解决现状问题的原理
Connection连接对象 | 操作特点 |
---|---|
创建时 | 连接对象不再由自己创建,而是系统启动的时候已经创建一定数量的连接, 并且放在连接池中 |
使用时 | 直接从连接池中去获取一个已经创建好的连接对象即可 |
关闭时 | 不是真的关闭连接对象,而是将连接对象再放回到连接池中,供下一个用户使用 |
数据库连接池API
目标
- 连接池的接口名
- 从连接池中得到连接的方法
数据源接口
javax.sql.DataSource接口
实现类在哪?由第三方厂商来实现,只要实现这个接口都可以编写自己的连接池。
数据源接口中的方法
DataSource接口中的方法 | 描述 |
---|---|
Connection getConnection() | 从连接池中获取连接对象 |
常用连接池参数含义
每个连接池都有很多的参数,几乎所有的参数都是有默认的值的,我们也可以根据实际情况进行调整。参数名在不同的连接池中参数名是有区别的。
常用参数 | 描述 |
---|---|
初始连接数 | 服务器启动的时候创建的连接对象数量 |
最大连接数 | 连接池中最多可以允许放多少个连接对象 |
最长等待时间 | 如果连接池中没有连接对象,设置用户等待的最长时间是多久,单位是毫秒。 如果超过这个时间就抛出异常 |
最长空闲回收时间 | 如果一个连接对象长时间没有人使用,设置多久回收这个对象,默认是不回收。 |
小结
-
连接池的接口名是什么?
javax.sql.DataSource
-
从连接池中得到连接的方法是什么?
getConnection()
c3p0连接池的介绍
目标
- 认识C3P0连接池
- c3p0连接池的配置文件和类
常用连接池的介绍
DataSource本身只是Oracle公司提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。我们只需要学习这个工具如何使用即可。
常用的连接池实现组件有这些:
- 阿里巴巴-德鲁伊druid连接池:Druid是阿里巴巴开源平台上的一个项目
- DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。
- C3P0是一个开源的JDBC连接池,目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能。
C3P0常用的配置属性
就算不设置任何参数,每个连接池都有默认的配置参数。不同的数据源实现厂商,下面这些属性名会不同。
常用参数 | 描述 |
---|---|
initialPoolSize | 初始连接数,一开始创建多少个连接对象 |
maxPoolSize | 连接池中最大连接数 |
checkoutTimeout | 最长等待时间,等多久没有获取到连接对象,抛出异常 |
maxIdleTime | 最长空闲回收时间,并不是到了这个时间马上回收,看连接池使用情况 |
配置文件的要求
使用c3p0的配置文件来配置连接池,配置文件有如下几个要求:
- 文件名:必须叫c3p0-config.xml
- 路径:这个文件必须要放在src目录下,即类路径下
- 分成两种配置
- 默认配置:在不指定配置名的情况下,默认使用的配置
- 命名配置:可以使用多个配置,通过名字来选择使用哪个配置
- 多个配置的好处:
- 可以使用不同的连接池参数
- 可以指定不同的数据库名,如:day20, day21
- 可以指定不同厂商的数据库,如:Oracle,MySQL
API的介绍
C3P0中的类
构造方法 | 描述 |
---|---|
ComboPooledDataSource() | 默认的构造方法,使用默认的配置来创建连接池 |
ComboPooledDataSource(命名配置) | 指定使用哪个命名配置来创建连接池 |
小结
- c3p0连接池配置文件名是?c3p0-config.xml
- 创建数据源的类是?ComboPooledDataSource
案例:使用C3P0创建连接池
需求
- 从连接池中得到10个连接对象,输出每个对象
- 分别设置默认配置和命名配置
导入的包
连接同mysql的驱动,复制到lib目录下
步骤
- 导入jar包c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar, 如果要连接mysql,还要数据库驱动程序:mysql-connector-java-5.1.37-bin.jar
- 配置xml
- 在src目录下创建配置文件c3p0-config.xml,配置对应参数
- 设置数据库的连接参数:用户名、密码、URL、驱动名
- 设置连接池配置参数:初始连接数、最大连接数、最长等待时间
- Java代码
- 创建数据源的实现类ComboPooledDataSource,使用默认配置或命名配置
- 从连接池中得到连接对象
代码
配置文件
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<!-- 默认配置 -->
<default-config>
<!--1. 连接数据库有关的参数,键是固定的,值可以修改 -->
<!--mysql驱动的名字-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--连接字符串URL-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day24</property>
<!--用户名-->
<property name="user">root</property>
<!--密码-->
<property name="password">root</property>
<!--2. 连接池配置有关的参数-->
<!--初始连接数-->
<property name="initialPoolSize">5</property>
<!--最大连接数-->
<property name="maxPoolSize">10</property>
<!--过多久没有获取连接,超时抛出异常-->
<property name="checkoutTimeout">3000</property>
</default-config>
<!--命名配置,可以使用多个-->
<named-config name="otherc3p0">
<!--mysql驱动的名字-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--连接字符串URL,修改了库名 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day23</property>
<!--用户名-->
<property name="user">root</property>
<!--密码-->
<property name="password">root</property>
<!--初始连接数-->
<property name="initialPoolSize">3</property>
<!--最大连接数-->
<property name="maxPoolSize">15</property>
<!--过多久没有获取连接,超时抛出异常-->
<property name="checkoutTimeout">2000</property>
</named-config>
</c3p0-config>
Java代码
package com.itheima;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 1. 从连接池中得到10个连接对象,输出每个对象
* 2. 分别设置默认配置和命名配置
*/
public class Demo1C3p0 {
public static void main(String[] args) throws SQLException {
//1.创建连接池,使用默认配置。ComboPooledDataSource实现了DataSource接口
//ComboPooledDataSource ds = new ComboPooledDataSource();
//使用命名配置
ComboPooledDataSource ds = new ComboPooledDataSource("otherc3p0");
//2.使用连接池,从连接池中获取10个连接对象
for (int i = 1; i <= 16; i++) {
Connection connection = ds.getConnection();
System.out.println("第" + i + "个连