Appearance
连接池介绍
没有连接池的现状
之前 JDBC 访问数据库的步骤: 创建数据库连接 →运行SQL语句→关闭连接 每次数据库访问执行这样重复的动作
每次创建数据库连接的问题
- 获取数据库连接需要消耗比较多的资源,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长。这样数据库连接对象的使用率低。
- 假设网站一天 10 万访问量,数据库服务器就需要创建 10 万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出
我们现实生活中每日三餐。我们并不会吃一餐饭就将碗丢掉,而是吃完饭后将碗放到碗柜中,下一餐接着使用。目的是重复利用碗,我们的数据库连接也可以重复使用,可以减少数据库连接的创建次数。提高数据库连接对象的使用率。
连接池的概念: 连接池是创建和管理数据库连接的缓冲池技术。连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。
连接池解决现状问题的原理
- 程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于碗柜/容器)。
- 使用的时候直接从连接池中取一个已经创建好的连接对象。
- 关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
连接池好处
连接池中保存了一些数据库连接,这些连接是可以重复使用的。节省数据库的资源消耗。
常用连接池的介绍
javax.sql.DataSource
表示数据库连接池,是 JDK 中提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。我们只需要学习这个工具如何使用即可。
java
public interface DataSource {
Connection getConnection();
}
常用的连接池实现组件有以下这些:
- 阿里巴巴-德鲁伊 Druid 连接池:Druid 是阿里巴巴开源平台上的一个项目
- C3P0 是一个开源的 JDBC 连接池,目前使用它的开源项目有 Hibernate,Spring 等。
- DBCP(DataBase Connection Pool)数据库连接池,是 Apache 上的一个 Java 连接池项目,也是 Tomcat 使用的连接池组件。
小结
连接池的好处?
连接池内部会保存好一些连接,这些连接可以反复使用,提高连接的使用率,降低数据库资源消耗
连接池的原理?
- 创建连接池时,连接池内部就会创建一些连接
- 当需要使用连接时,就直接从连接池里面取出连接
- 当连接使用完毕时,重新放回连接池
C3P0连接池
C3P0连接池简介
C3P0 是一个开源的连接池。Hibernate 框架,默认推荐使用 C3P0 作为连接池实现。
C3P0 地址:https://sourceforge.net/projects/c3p0/?source=navbar
快速入门
c3p0.xml
注意
IDEA项目
将c3p0.xml放到src目录中
Web项目
将c3p0.xml放到web/WEB-INF目录中
Maven项目
将c3p0.xml到src/main/resources目录中
xml<c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/${db_name}</property> <property name="user">${db_username}</property> <property name="password">${db_password}</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">2000</property> <property name="maxIdleTime">1000</property> </default-config> </c3p0-config>
C3P0Practice.java
javapublic class C3P0Practice { public static void main(String[] args) throws Exception { // 1. 创建连接池 ComboPooledDataSource ds = new ComboPooledDataSource(); // 2. 获取连接对象 Connection connection = dataSource.getConnection(); // 3. 创建statement对象 PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM emp"); // 4. 执行sql语句 ResultSet resultSet = pstmt.executeQuery(); // 5. 处理结果集 while(resultSet.next()) { System.out.println(resultSet.getString("empno")); System.out.println(resultSet.getString("ename")); System.out.println(resultSet.getString("job")); System.out.println("----------"); } // 6. 关闭资源 resultSet.close(); pstmt.close(); connection.close(); } }
Druid连接池
Druid连接池简介
Druid 是阿里巴巴开发的号称为监控而生的数据库连接池,Druid 是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控 DB 池连接和 SQL 的执行情况。Druid 已经在阿里巴巴部署了超过 600 个应用,经过一年多生产环境大规模部署的严苛考验。
Druid 地址:https://github.com/alibaba/druid
快速入门
druid.properties
注意
IDEA项目
将druid.properties放到src目录中
Web项目
将druid.properties放到web/WEB-INF目录中
Maven项目
将druid.properties放到src/main/resources目录中
propertiesdriverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/day25 username=root password=root initialSize=5 maxActive=10 maxWait=3000
DruidPractice.java
javapackage com.futureweaver; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; public class DruidPractice { public static void main(String[] args) throws Exception { // 1. 创建连接池 InputStream is = ClassLoader.getSystemResourceAsStream("druid.properties"); Properties properties = new Properties(); properties.load(is); DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); // 2. 获取连接对象 Connection connection = dataSource.getConnection(); // 3. 创建statement对象 PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM emp"); // 4. 执行sql语句 ResultSet resultSet = pstmt.executeQuery(); // 5. 处理结果集 while(resultSet.next()) { System.out.println(resultSet.getString("empno")); System.out.println(resultSet.getString("ename")); System.out.println(resultSet.getString("job")); System.out.println("----------"); } // 6. 关闭资源 resultSet.close(); pstmt.close(); connection.close(); } }
Idea模板
- 进入 Idea 欢迎页面,左侧导航栏,选择Customize,选择All Settings...
- 如果已开启某个项目,点击菜单栏-File-Close Project
- 左侧导航栏,选择Editor->File And Code Templates
c3p0.xml
- 右侧视图,选择
Files
选项卡- 点击
+
Name
->c3p0.xml
Extention
->xml
File Name
->c3p0.xml
- 将以下内容,粘贴到模板内部
xml
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/${db_name}</property>
<property name="user">${db_username}</property>
<property name="password">${db_password}</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">2000</property>
<property name="maxIdleTime">1000</property>
</default-config>
</c3p0-config>
druid.properties
- 右侧视图,选择
Files
选项卡- 点击
+
Name
->druid.properties
Extention
->properties
File Name
->druid.properties
- 将以下内容,粘贴到模板内部
properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/${db_name}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=${db_username}
password=${db_password}
# 初始化connection数量
initialSize=10
# 最大连接数量
maxActive=50
# 最小空闲数量
minIdle=5
# 等待时间
maxWait=5000
课程目标总结
- 能够理解连接池解决现状问题的原理
- 能够使用 C3P0 连接池
- 能够使用 DRUID 连接池