一、数据库连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
二、原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
三、C3P0数据源
这里主要介绍C3P0开源数据库连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
1.配置信息p3p0.propertise
#jdbc基本信息
driverClass = com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcUrl = jdbc:sqlserver://127.0.0.1:1435; DatabaseName = OMIMS
user = houxue
password = asd123
#c3p0连接池信息
c3p0.minPoolSize = 3
c3p0.maxPoolSize = 25
c3p0.initialPoolSize = 10
c3p0.maxStatement = 20
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数
c3p0.acquireIncrement = 3
#定义在从数据库获取新连接失败后重复尝试的次数
c3p0.acquireRetryAttempts = 60
#两次连接中间隔时间,单位毫秒
c3p0.acquireRetryDelay = 1000
#连接关闭时默认将所有未提交的操作回滚
c3p0.autoCommitOnClose = false
#当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒
c3p0.checkoutTimeout = 3000
#每120秒检查所有连接池中的空闲连接。Default: 0
c3p0.idleConnectionTestPeriod = 120
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
c3p0.maxIdleTime = 600
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
c3p0.testConnectionOnCheckin = true
#c3p0将建一张名为c3p0TestTable的空表,并使用其自带的查询语句进行测试。
jdbc.automaticTestTable = c3p0TestTable
2.配置数据库连接信息ConfigUtil.java
package com.sdust.omims.db.utils;
import java.io.FileInputStream;
import java.util.Properties;
/**
* 配置数据库连接信息
*
* @author Shmily
* @version 1.0
*/
public class ConfigUtil {
// 配置文件的所有信息
private static Properties c3p0Pro = null;
// 配置文件中关于C3P0的信息
private static Properties c3propes = null;
// 配置文件中关于JDBC的信息
private static Properties jdbcpropes = null;
// 初始化配置文件代码块
static {
initDBSource();
}
/**
* 读取配置文件
*/
public static final void initDBSource() {
c3p0Pro = new Properties();
try {
// 加载配置文件
c3p0Pro.load(new FileInputStream("./properties/c3p0.properties"));
} catch (Exception e) {
e.printStackTrace();
}
jdbcpropes = new Properties();
c3propes = new Properties();
for (Object key : c3p0Pro.keySet()) {
String skey = (String) key;
if (skey.startsWith("c3p0.")) {
c3propes.put(skey, c3p0Pro.getProperty(skey));
} else {
jdbcpropes.put(skey, c3p0Pro.getProperty(skey));
}
}
}
/**
* 获取配置文件的所有信息
*
* @return c3p0Pro 配置文件的所有信息
*/
public Properties getConfiguration() {
return c3p0Pro;
}
/**
* 获取C3P0配置信息
*
* @return c3propes C3P0配置信息
*/
public Properties getC3P0Propes() {
return c3propes;
}
/**
* 获取JDBC配置信息
*
* @return jdbcpropes JDBC配置信息
*/
public Properties getJDBCPropes() {
return jdbcpropes;
}
}
3.创建数据库连接DBUtil.java
package com.sdust.omims.db.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.DataSources;
/**
* 数据库工具类 封装数据库访问的相关内容,并提供一组数据库操作方法
*
* @author Shmily
*/
public class DBUtil {
private static final String JDBC_DRIVER = "driverClass";
private static final String JDBC_URL = "jdbcUrl";
// 数据库连接配置信息
ConfigUtil configUtil = null;
Connection dbConnection = null;
ResultSet dbResultSet = null;
Statement dbStatement = null;
boolean isConfigured = false;
boolean isDriverLoaded = false;
boolean isConnected = false;
boolean isStatementCreated = false;
/**
* 加载数据库驱动
*/
public void loadDriver() {
if (!isConfigured) {
getConfiguration();
isConfigured = true;
}
String driverClass = configUtil.getConfiguration().getProperty(
JDBC_DRIVER);
if (driverClass != null) {
try {
// 加载驱动类
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
isDriverLoaded = true;
}
/**
* 获取C3P0配置信息
*/
public void getConfiguration() {
configUtil = new ConfigUtil();
}
/**
* 获取数据库连接
*/
public void getConnectioned() throws Exception {
if (!isDriverLoaded) {
loadDriver();
isDriverLoaded = true;
}
DataSource ds = null;
// 建立连接池
DataSource unPooled = DataSources.unpooledDataSource(configUtil
.getConfiguration().getProperty(JDBC_URL), configUtil
.getJDBCPropes());
ds = DataSources.pooledDataSource(unPooled, configUtil.getC3P0Propes());
dbConnection = ds.getConnection();
isConnected = true;
}
}