原链接:JAVA连接池介绍-C3P0连接池|CloudWong
背景
初学JDBC技术来连接数据库时,每一次连接DBMS都需要很繁琐的执行以下步骤:
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库URL
String url = "jdbc:mysql://localhost:3306/test?" +"user=root&password=root";
//3.获取数据库连接
conn = DriverManager.getConnection(url);
不论是一次小小的查询还是添加一条记录,你都得老老实实的按这三步走(加载驱动,连接数据库URL,获取数据库连接)。然而当系统变得复杂了,数据库的操作更加频繁,系统的性能也会随之下降。
有句话说“数据库连接很昂贵”。每一次创建一个数据库连接,他的内部都会执行着:
“DriverManager”检查并注册驱动程序。
在驱动程序类中调用“connect(url…)”方法。
connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。
创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。
有时数据库连接所耗费的时间甚至大于执行查询操作所花费的时间,如果有一种方法,能够预先加载好一些连接对象,每当要执行数据库操作时,无需重新建立连接,只需使用预先加载好的一个连接对象,那么系统的性能将会大大的提高。
连接池就是为解决这类问题存在的。
连接池
定义
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
原理
简单的说,连接池就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
于是,通过连接池,我们只要在系统启动时预先加载好一些连接对象,当需要的时候再也不需要繁琐的步骤,现成的给你准备好啦,拿了就用,用完了放回去下次再接着用,系统加载的速度会变快,性能也会随之增加了。
几种主流的java连接池
C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有hibernate,spring等。是一个成熟的、高并发的JDBC连接池库,用于缓存和重用PreparedStatements支持。c3p0具有自动回收空闲连接功能。
主要特性:1、编码的简单易用。2、连接的复用。3、连接的管理
DBCP
是Apache上的一个 Java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar
,common-pool.jar
,common-collections.jar
由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。
Proxool
Proxool是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
C3P0连接池使用
准备
下载 C3P0连接池jar包和mysql驱动,导入工程文件。
-
创建配置文件c3p0-config.xml。(在src根目录下,名字不能改)
书写连接池配置
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- This is default config! -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/contacts?characterEncoding=utf8</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>
</default-config>
<!-- This is my config for mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
配置信息主要是填写数据库驱动、数据库名称、数据库用户名、密码等等,一般修改这些信息,其他的按默认的就可以了。
启动C3P0连接池
完成了前面的准备工作和信息配置,下面就正式进入连接池的操作了。
建立一个C3P0Demo测试类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 数据库工具类
* @author cloud
*
*/
public class C3P0Util {
static ComboPooledDataSource cpds=null;
static{
cpds = new ComboPooledDataSource();//这是mysql数据库
}
/**
* 获得数据库连接
* @return Connection
*/
public static Connection getConnection(){
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("连接失败");
return null;
}
}
/**
* 放回连接对象,close方法并不是关闭,而是更改该连接对象的状态为可用。
* @param conn
*/
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在test数据库中创建一个student表
在刚刚创建的测试类C3P0Demo种添加如下main方法,插入1条数据
NO:201701
NAME:TOM
/**
* 测试DBUtil类
* @param args
*
*/
public static void main(String[] args) {
Connection conn = C3P0Util.getConnection();
System.out.println("连接成功");
//插入信息的sql语句
String sql = "insert into student(no,name)values(?,?)";
try{
//获取PreparedStatement对象
PreparedStatement ps = conn.prepareStatement(sql);
//对sql语句对占位符进行动态赋值
ps.setString(1, "201701");
ps.setString(2, "TOM");
//执行更新操作
ps.executeUpdate();
ps.close();
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭数据库连接
C3P0Util.close(conn);
}
}
运行程序,执行结果如下
查看数据库,可以看到刚刚插入的数据已经成功插入,证明C3P0数据库配置成功。