java--Mysql连接池管理类

package model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Logger;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import unit.FX;

/**
 * DbcpManager
 * 是数据库连接池的总管理类
 * 封装了对于连接池的相关操作
 * 
 * @author 集成显卡
 *	2010.9.11
 */
public class DbcpManager {

	protected static Logger log=Logger.getLogger("DbcpManager:");
	
	//连接数据库的相关参数
	
	private static String driver="com.mysql.jdbc.Driver";
	/*
			url="jdbc:mysql://localhost:3306/question?useUnicode=true&characterEncoding=GBK",
			user="root",
			password="19891231";
	 */
	
	//数据源
	private static BasicDataSource basicDS=null;
	//当前的连接数
	private static int linkNum=0;
	
	/*
	 * 私人构造函数
	 */
	private DbcpManager(){
		
	}
	
	/**
	 * static 语句
	 * 实例basicDS
	 */
	static{
		basicDS=initDataSource(FX.url,FX.username,FX.password);
	}
	
	/**
	 * 初始DataSource
	 * @param Url
	 * @param Name
	 * @param Password
	 * @return BasicDataSource
	 */
	protected static BasicDataSource initDataSource(String Url,String Name,String Password){
		BasicDataSource tempDS=new BasicDataSource();
		
		tempDS.setDriverClassName(driver);
		tempDS.setUrl(Url);
		tempDS.setUsername(Name);
		tempDS.setPassword(Password);

		tempDS.setMaxIdle(20);//池里不会被释放的最多空闲连接数量。设置为0时表示无限制。
		tempDS.setMinIdle(5);
		tempDS.setMaxActive(100);//同一时间可以从池分配的最多连接数量。设置为0时表示无限制。
		tempDS.setMaxWait(3000);
		tempDS.setInitialSize(10);//池启动时创建的连接数量
		
		tempDS.setRemoveAbandoned(true);
		tempDS.setRemoveAbandonedTimeout(6);// 当空闲连接耗尽,超过这个时间(秒),就会释放未关闭的连 接
		
		log.info("BasicDataSource配置成功");
		
		return tempDS;
	}
	
	/**
	 * 断开DataSource
	 * @param 
	 * @return 
	 */
	protected static void destoryDataSource(){
		try{
			basicDS.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
		basicDS=null;
		log.info("DataSource destoryed-----OK");
	}
	
	/**
	 * 返回DataSource
	 * @return
	 */
	public static DataSource getDataSource(){
		return basicDS;
	}
	
	/**
	 * 取得一个Connection
	 * 当已经是最大连接限制时warn
	 * 
	 * @return
	 */
	public static Connection getConnection(){
		try{
			//取得当前连接数
			linkNum=basicDS.getNumActive();
			if(linkNum==basicDS.getMaxActive()){
				log.warning("达到了连接上限。");
			}
			
			log.info("返回Connection成功,当前连接数:"+(linkNum+1));
			return basicDS.getConnection();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 释放Connection
	 * @param con
	 */
	public static void freeConnection(Connection con){
		if(con!=null){
			try{
				con.close();
			}
			catch(Exception e){
				e.printStackTrace();
			}
		}
		log.info("释放Connection成功,当前连接数:"+(basicDS.getNumActive()));
	}
	
	public static void main(String args[]){
		try {    
            Connection conn = DbcpManager.getConnection();    
            if(conn != null){    
                Statement statement = conn.createStatement();    
                ResultSet rs = statement.executeQuery("select * from item");    
                int c = rs.getMetaData().getColumnCount();    
                while(rs.next()){                           
                    for(int i=1;i<=c;i++){    
                        System.out.print(rs.getObject(i)+"   ");    
                    }
                    System.out.println();
                }    
                rs.close();    
            }    
            DbcpManager.freeConnection(conn);    
        } catch (SQLException e) {              
            e.printStackTrace();    
        }    
	}
}


posted @ 2012-07-08 20:33  集成显卡  阅读(388)  评论(0编辑  收藏  举报