对apache dbcp的封装
来源:互联网 发布:游侠网络对战平台 编辑:程序博客网 时间:2024/04/29 17:11
Apache dbcp 数据库连接池,这是一个很不错的软件,可以大大的提高我们jsp应用程序的性能,开发前奏,获取软件,下载地址:http://commons.apache.org/downloads/download_dbcp.cgi
加压文件commons-dbcp-1.2.2.jar 到你项目的类路径中 但是光有它还是不够的,它依赖commons-pool-1.3.zip 这个开源项目,下载地址http://commons.apache.org/downloads/download_pool.cgi
最新的版本是1.3 解压commons-pool-1.3.jar 文件到你的类路径中,这样我们的就算是完事了,基本上平台 就算是搭起来了。
下面给大家看看我的具体实现
/*
* Mssql.java
*
* Created on 2007年10月22日, 上午10:14
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package cn.CCmingzhou.db;
import java.sql.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.apache.commons.dbcp.*;
import org.apache.commons.pool.*;
import org.apache.commons.pool.impl.*;
/**
*冷漠大神 qq:361619004
* @author Angel
*/
public class Mssql {
/** Creates a new instance of Mssql */
private static String path="";
private static String strDriver="";
private static String strConn="";
private static String strUser="";
private static String strPass="";
private static Class driverClass = null;
private static ObjectPool connectionPool = null;
public Mssql() {
}
/**
* 装载配置文件 mssql.xml WEB-INF/mssql.xml
*/
private void loadXml()
{
path=this.getClass().getResource("/").toString();
path=path.substring(6,path.length()-8)+"mssql.xml";
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse(path);
doc.normalize();
NodeList links=doc.getElementsByTagName("link");
for (int i=0;i<links.getLength();i++){
Element link=(Element)links.item(i);
strDriver=link.getElementsByTagName("Driver").item(0).getFirstChild().getNodeValue();
strConn=link.getElementsByTagName("URL").item(0).getFirstChild().getNodeValue();
if(link.getElementsByTagName("UserName").item(0).getFirstChild()!=null){
strUser=link.getElementsByTagName("UserName").item(0).getFirstChild().getNodeValue();
}else{
strUser="";
}
if(link.getElementsByTagName("Password").item(0).getFirstChild()!=null){
strPass=link.getElementsByTagName("Password").item(0).getFirstChild().getNodeValue();
}else{
strPass="";
}
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 初始化数据源
*/
private static synchronized void initDataSource() {
if (driverClass == null) {
try {
driverClass = Class.forName(strDriver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 连接池启动
* @throws Exception
*/
public void StartPool() {
loadXml();
initDataSource();
if (connectionPool != null) {
ShutdownPool();
}
try {
connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(strConn,strUser,strPass);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
driver.registerPool("dbpool", connectionPool);
System.out.println("装配连接池完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 释放连接池
*/
public static void ShutdownPool() {
try {
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
driver.closePool("dbpool");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 取得连接池中的连接
* @return
*/
public Connection getConnection() {
Connection conn = null;
if(connectionPool == null)
StartPool();
try {
conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:dbpool");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 获取连接
* getConnection
* @param name
* @return
*/
public Connection getConnection(String name){
return getConnection();
}
/**
* 释放连接
* freeConnection
* @param conn
*/
public static void freeConn(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放连接
* freeConnection
* @param name
* @param con
*/
public static void freeConn (String name,Connection con){
freeConnection(con);
}
}
细心的朋友可以能回看到它还需要一个xml的文件 不错正是需要一个mssql.xml的配置文件 下面吧mssql.xml粘出来
mssql.xml
<?xml version="1.0" encoding="gb2312"?>
<DataBase>
<link>
<Driver>com.microsoft.jdbc.sqlserver.SQLServerDriver</Driver>
<URL>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test</URL>
<UserName>sa</UserName>
<Password>love</Password>
</link>
</DataBase>
看到没 简单的不能再简单的了,这个不用我多做解说了吧!
下面简单的给大家说说Mssql.class这个类 ,当有第一个用户和数据库 建立连接的时候回开启连接池,并且去调用loadXml();方法,这个方法的任务是去解析mssql.xml文件,注意这个mssql.xml的文件一定要放到你的成的WEB-INF/mssql.xml 放到这里,否则就找不到配置文件了,呵呵,一但连接池启动了,除非我们人为的去调用ShutdownPool()方法,否则,连接池开启了几不会关闭,除非你的服务器重新启动,当第一个用户和数据库建立连接的时候又会开启连接池!但是现在这个类还不够人性化,我们在去写一个MsManager的类
MsManager.java
/*
* MsManager.java
*
* Created on 2007年10月23日, 下午1:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package cn.CCmingzhou.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*冷漠大神 qq:361619004
* @author Angel
*/
public class MsManager {
/** Creates a new instance of MsManager */
public MsManager() {
}
Connection conn=null;
Statement stmt=null;
Mssql ms=new Mssql();
/**
*查询方法 传进去一个查询的sql语句
*返回一个ResultSet结果集
*/
public ResultSet query(String sql)
{
ResultSet rs=null;
conn=ms.getConnection();
try
{
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
}catch(SQLException e)
{
e.printStackTrace();
}
return rs;
}
/**
*增 删 改 方法 传进去一个增 删 改 的sql语句 会返回一个 boolean值
*当boolean值返回true时 sql执行成功 false则失败,请检查你的sql语法。
*/
public boolean update(String sql)
{
boolean check=false;
conn=ms.getConnection();
try
{
stmt=conn.createStatement();
int i=0;
i=stmt.executeUpdate(sql);
if(i!=0)
check=true;
}catch(SQLException e)
{
e.printStackTrace();
}
return check;
}
/**
* 释放连接 把conn 对象释放掉!
*/
public void close()
{
ms.freeConnection(conn);
}
}
这样就人性化了吧,我们用的时候直接创建一个MsManager类的一个对象,调用query()或update() 调用完了在调用close()释放资源就一切OK了 ,是不是很简单啊,这样Mssql 我们就永远不用去动它了,在这里和大家说一下,这里并没有体现出最大连接数和最大活跃数还有最小连接数的感念,但是实现起来并不难,为什么不去实现它,现在呢,我们用的时候就去池里创建一个连接,用完了就释放掉,如果你设定了最大连接数,那么超过了最大连接数的时候就会发生异常,所以现在的程序有一个自适应的概念,也就是说你这么去实现的你的程序的话,无论你的程序访问的人多或是少都不出错误,所以我觉的这么实现很合理,如果大家有好的实现也告诉我哈,一起交流技术嘛!
作者:高秋
网名:冷漠大神
Qq:361619004
Mail:hackq@163.com
Time:2007年11月2日星期五
- 对apache dbcp的封装
- org.apache对javamail的封装
- apache commons dbcp 的使用
- spring使用apache的dbcp对clob字段操作的错误
- Apache 对JDK封装的很实用的类
- 我说说apache对数据库结果集的封装
- apache dbcp数据库连接池的使用
- 基于 Apache DBCP 的数据库连接获取类
- Apache Torque的关键配置参数 (DBCP)
- 用apache的dbcp数据库缓冲池
- 用apache的dbcp数据库缓冲池
- 基于Apache的DBCP建立连接池
- apache dbcp basicdatasource validator
- Apache-dbcp 属性
- Apache DBCP Tutorial
- DBCP使用apache
- Oracle版本:12c 出现的异常:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionF
- apache dbcp连接池设置导致的一个问题
- Jsp分页组件制作
- 怎样在标题显示背景图.
- 最有效防电脑辐射方法
- 试验网站#1搜索引擎优化收录情况记录(断续运行)2007-11-7
- 试验网站#3搜索引擎优化收录情况记录2007-11-7
- 对apache dbcp的封装
- malloc()以及free()的机制
- 什么是module 以及如何写一个module
- Bad man and Bad man
- MKS8.0支持UNIX命令列表
- asp读配置文件的两种方法
- linux 下调用当前用户名
- Webcast 系列课程
- 手机刷wm6成功