java数据库连接池dbcp的使用
近年来,随着 Internet/Intranet 建网技术的飞速发展和在世界范围内的迅速普及,计算机
应用程序已从传统的桌面应用转到 Web 应用。基于 B/S(Browser/Server)架构的 3 层开发模式逐渐代替 C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍採用的技术。
在 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁,
即 Java 语言通过 JDBC 技术訪问数据库。JDBC 是一种“开放”的方案,它为数据库应用开发者﹑数据库前台工具开发者提供了一种标准的应用程序设计接口,使开发者能够用纯 Java 语言编写完整的数据库应用程序。JDBC 提供两种 API,各自是面向开发者的 API 和面向底层的 JDBC 驱动程序 API,底层主要通过直接的 JDBC 驱动和 JDBC-ODBC 桥驱动实现与数据库的连接。
一般来说,Java 应用程序訪问数据库的过程是:
①装载数据库驱动程序;
②通过 JDBC 建立数据库连接;
③訪问数据库,运行 SQL 语句;
④断开数据库连接。
由上面的分析能够看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,
package util;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;/**
-
Description: 数据库连接池类
-
@filename DataSourceFactory.java
-
@date 2013 年 8 月 21 日 19:47:21
-
@author Herman.Xiong
-
@version 1.0
-
Copyright (c) 2013 Company,Inc. All Rights Reserved.
*/
public class DataSourceFactory {
private static Logger log = Logger.getLogger(DataSourceFactory.class);
private static BasicDataSource bs = null;
public static String driver,url,userName,password;/**
- 创建数据源
- @return
/
public static BasicDataSource getDataSource() throws Exception{
if(bs==null){
log.info("数据库连接信息:[driver:"+driver+",url:"+url+",userName:"+userName+",password:"+password+"]");
bs = new BasicDataSource();
bs.setDriverClassName(driver);
bs.setUrl(url);
bs.setUsername(userName);
bs.setPassword(password);
bs.setMaxActive(200);// 设置最大并发数
bs.setInitialSize(30);// 数据库初始化时,创建的连接个数
bs.setMinIdle(50);// 最小空暇连接数
bs.setMaxIdle(200);// 数据库最大连接数
bs.setMaxWait(1000);
bs.setMinEvictableIdleTimeMillis(601000);// 空暇连接 60 秒中后释放
bs.setTimeBetweenEvictionRunsMillis(5601000);//5 分钟检測一次是否有死掉的线程
bs.setTestOnBorrow(true);
}
return bs;
}
/**
- 释放数据源
*/
public static void shutDownDataSource() throws Exception{
if(bs!=null){
bs.close();
}
}
/**
- 获取数据库连接
- @return
*/
public static Connection getConnection(){
Connection con=null;
try {
if(bs!=null){
con=bs.getConnection();
}else{
con=getDataSource().getConnection();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return con;
}
/**
- 关闭连接
*/
public static void closeCon(ResultSet rs,PreparedStatement ps,Connection con){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
log.error("关闭结果集 ResultSet 异常!"+e.getMessage(), e);
}
}
if(ps!=null){
try {
ps.close();
} catch (Exception e) {
log.error("预编译 SQL 语句对象 PreparedStatement 关闭异常!"+e.getMessage(), e);
}
}
if(con!=null){
try {
con.close();
} catch (Exception e) {
log.error("关闭连接对象 Connection 异常!"+e.getMessage(), e);
}
}
}
}