一、连接池的概述
1. Jdbc访问数据库
JDBC访问数据库时操作Connection对象: 访问数据库所有的操作都是先创建连接对象,使用连接对象,使用一次以后就关闭连接对象。
连接对象的使用问题:
-
1)数据库创建连接通常需要消耗相对较多的资源,创建时间也较长,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,这样数据库连接对象的使用率低;
-
2)假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出。
2. 什么是连接池
连接池需要解决两个问题:
- 提高创建连接的速度,快速的得到一个连接对象
- 提高连接对象的使用率
连接池的原理图(使用连接池)
3. 连接池运行机制
- 1) 程序初始化时创建连接池
- 2) 使用时向连接池申请可用连接
- 3) 使用完毕,将连接返还给连接池供下一个用户请求调用
- 4) 程序退出时,断开所有连接,并释放资源
4. 常用连接池参数
常用参数 | 描述 |
---|---|
初始连接数(initPoolSize) | 一开始连接池创建的时候创建多少个连接对象在连接池中 |
最大连接数(maxPoolSize) | 连接池中最多可以有多少个连接对象 |
最长等待时间(maxWait) | 如果连接池中没有空闲连接对象,当前用户等待一段时间后抛出异常,单位是毫秒 |
最长空闲回收时间 | 如果某个连接对象长时间没有被使用,一段时间后被服务器回收,默认是0(表示不回收) |
注:有些连接池并不支持最长空闲回收。
二、C3P0连接池的使用
1. 常用连接池的介绍
DataSource本身只是Oracle公司提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。常用的连接池实现组件如下:
-
阿里巴巴druid连接池
:Druid是阿里巴巴开源平台上的一个项目; -
C3P0连接池
:是一个开源的Jdbc连接池,目前使用它的开源项目有Hibernate,Spring等,C3P0有自动回收空闲连接功能; -
DBCP(DataBase Connection Pool)连接池
:是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。
2. 使用C3P0连接池步骤
pom.xml
中添加C3P0依赖- 配置
jdbc.properties
application.xml
中创建连接池- 创建
SqlSessionFactoryBean
,注入连接池
3. pom.xml
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
4. jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=5
jdbc.maxPoolSize=8
jdbc.minPoolSize=2
jdbc.maxIdleTime=600
jdbc.acquireIncrement=2
5. applicationContext.xml
<!-- 创建连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 初始化连接数 -->
<property name="initialPoolSize" value="${jdbc.initialSize}" />
<!-- 最大连接数 -->
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
<!-- 最小连接数 -->
<property name="minPoolSize" value="${jdbc.minPoolSize}"></property>
<!-- 连接的最大空闲时间-->
<property name="maxIdleTime" value="${jdbc.maxIdleTime}"></property>
<!-- 连接池在获得新连接失败时重试次数 -->
<property name="acquireIncrement" value="${jdbc.acquireIncrement}"></property>
</bean>
<!-- 创建SqlSessionFactoryBean,注入连接池 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
三、DRUID连接池
1. Druid简介
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。如:一年一度的双十一活动,每年春运的抢火车票。
2. Druid常用的配置参数
参数 | 说明 |
---|---|
driverClassName | 驱动类名,根据url自动识别,这一项可配可不配 |
url | 数据库连接字符串 jdbc:mysql://localhost:3306/数据库名 |
username | 数据库的用户名 |
password | 数据库的密码 |
initialSize | 初始化时建立的物理连接的个数 |
maxActive | 连接池中最大连接数 |
maxWait | 获取连接时最长等待时间,单位是毫秒 |
3. 使用Druid连接池步骤
pom.xml
中添加Druid依赖- 配置
jdbc.properties
application.xml
中创建连接池- 创建
SqlSessionFactoryBean
,注入连接池
4. pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
5. jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=5
jdbc.maxActive=50
jdbc.maxWait=3000
jdbc.minIdle=3
#jdbc.maxIdle=6 最大空闲连接数,已不再使用
6. applicationContext.xml
<!-- 创建连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 数据库基本信息配置 -->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 启用web监控功能 -->
<!--<property name="filters" value="${filters}"/>-->
<!-- 初始化连接数量 -->
<property name="initialSize" value="${jdbc.initialSize}"/>
<!-- 最大并发连接数 -->
<property name="maxActive" value="${jdbc.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${jdbc.maxWait}"/>
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${jdbc.minIdle}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<!--<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>-->
</bean>
<!-- 创建SqlSessionFactoryBean,注入连接池 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>