为什么引入连接池
首先我们要明白," 建立数据库连接 " 是相当消耗资源和时间的,同时,建立数据库连接的数量也是有限的(所以在初学时,才强烈要求操作完后,一定要记得关闭数据库连接,避免造成资源浪费)。
当多用户同时请求操作的情况下,就会造成频繁的数据库连接和关闭,导致系统性能低下。所以为了解决这个问题,就引入了"池"的概念,数据库连接池主要职责是管理"连接"(建立连接、关闭连接等),进而优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销。
在创建连接池的时候,一般会初始化连接池中的连接数量,以及最大连接数量。当用户请求连接时,就会从连接池中获取连接,如果连接池的初始化连接数不够,就会添加连接数,但连接池中的连接数目不能超过连接池的最大连接数。当用户操作完后,不是关闭连接,而是将连接归还到连接池中,供下一个用户使用。这样就可以避免频繁的建立连接和关闭连接所造成的消耗。
引入c3p0连接池依赖
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
实现C3P0连接池
Myabtis内部没有引入C3P0连接池对它提供直接支持,但它提供了一个UnPooledDataSourceFactory连接池工厂类,我们可以继承该类来实现C3P0连接池
package com.cd.o2o.config.dao;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
/**
* MyBatis使用C3P0的数据源工厂类
*/
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
public C3P0DataSourceFactory() {
this.dataSource = new ComboPooledDataSource();
}
}
配置C3P0连接池
实现C3P0连接池后,还需要再mybatis-config.xml配置文件中修改dataSource元素。
-
dataSource元素的type属性值需改为我们实现的C3P0连接池类的全类名。
-
并且不同数据库连接池对基本属性的命名是不同的,所以这里的基本属性也需要改成C3P0连接池特定的名称。
具体对比下面两个配置:
<!--采用POOLED连接池方式管理数据库连接-->
<dataSource type="POOLED">
<!--数据库连接基本属性-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/o2o?useUnicode=true&useSSL=false&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
<!--采用C3P0连接池方式管理数据库连接-->
<dataSource type="com.cd.o2o.config.dao.C3P0DataSourceFactory">
<!--数据库连接基本属性-->
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/o2o?useUnicode=true&useSSL=false&characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<!--c3p0连接池私有属性-->
<!--初始化连接数-->
<property name="initial PoolSize" value="5"/>
<!--最小连接数,一般与初始化连接数相同-->
<property name="minPoolSize" value="5"/>
<!--最大连接数-->
<property name="maxPoolSize" value="20"/>
<!--关闭连接后不自动commit-->
<property name="autoCommitOnClose" value="false"/>
<!--获取连接超时时间-->
<property name="checkoutTimeout" value="10000"/>
<!--连接失败重试次数-->
<property name="acquireRetryAttempts" value="2"/>
</dataSource>
MyBatis整合其它连接池
Mybatis整合其它连接池(如DBCP、Druid等)的方式其实跟整合C3P0的方式是一样的,都是先引入相关依赖,然后继承UnPooledDataSourceFactory连接池工厂类实现指定的连接池类,最后再mybatis-config.xml配置文件的dataSource元素中进行相关配置即可