C3PO数据库连接池
一、数据库连接池原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。
使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。
同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
二、C3PO数据库连接池
所需jar文件:
首页,下载以上jar包,放到项目的lib目录下,并build path
其次,编写c3po-config.xml配置文件
内容如下:
<?xml version ="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="c3p0">
<!-- 指定数据库连接源的基本属性 -->
<!--MySQL数据库驱动程序-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--MySQL数据库地址-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8</property>
<!--MySQL数据库用户名-->
<property name="user">root</property>
<!--MySQL数据库密码-->
<property name="password"></property>
<!-- 若数据库连接数不足时,一次向数据库服务器申请多少个连接 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时的连接数量 -->
<property name="initialPoolSize">10</property>
<!-- 数据库连接池中的最小连接数量 -->
<property name="minPoolSize">10</property>
<!-- 数据库连接池中的最大连接数量 -->
<property name="maxPoolSize">50</property>
<!-- C3P0数据库连接池可以维护的statement的个数 -->
<property name="maxStatements">50</property>
<!-- 每个连接可以同时使用的statement对象的个数 -->
<property name="maxStatementsPerConnection">10</property>
</named-config>
</c3p0-config>
接着,在src下的工具类包(一般包名是xx.xxx.utils)里面创建一个DBUtil.java文件,内容如下:
package com.poster.dby.utils;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.PreparedStatement;
import java.sql.Connection;
public class DBUtil {
private static ComboPooledDataSource comboPooledDataSource = null;
//静态代码块
static{
/* * 读取c3p0的xml配置文件创建数据源,c3p0的xml配置文件c3p0-config.xml必须放在src目录下 * 使用c3p0的命名配置读取数据源 */
comboPooledDataSource = new ComboPooledDataSource("c3p0");
}
//从数据源中获取数据库的连接
public static Connection getConnection() throws SQLException {
return comboPooledDataSource.getConnection();
}
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(Connection conn,PreparedStatement ps,ResultSet rs) {
try {
if (rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if (ps!=null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if (conn!=null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(PreparedStatement ps,Connection conn) {
try {
if (ps!=null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
最后,在操作数据库的时候,使用
Connection conn = DBUtil.getConnection();
即可获取连接。
最后的最后,不要忘记关闭数据库哦
//用来回收连接,适用于删改查
DBUtil.closeDB(rs,ps,conn);
//用来回收连接,适用于增
DBUtil.closeDB(ps,conn);