对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日星期五
 

原创粉丝点击