日期:2014-05-16  浏览次数:20570 次

数据库连接池的简单实现
?? ?自己的一个数据库作业的一部分,数据库连接池的简单实现,采取的是单例模式,同时采用了同步锁机制。关于单例模式大家可以参考《java与模式》,条件同步锁可以参考我之前的一些博文介绍。代码如下,忘大家不吝赐教。
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;



//采用单例模式进行设计
public class ConnectionPool {
    
    private static final ConnectionPool m_instance = new ConnectionPool();
	private List<Connection> pool=null;
    private int initialSize = 5;//连接池的初始大小
    
    private String driverClassName = null;
    private String username = null;
    private String password = null;
    private String url =null;
   
    //条件同步锁
    private Lock Conlock;
    private Condition T;
    
    
    //构造一个连接池
    private ConnectionPool()
	{
		init();	
		 
	}
	
//  返回单例
	public static ConnectionPool getInstance()
	{
		return m_instance;
		
	}
	
    
    //从连接池中获得一个连接,这里采用条件同步机制
	public Connection getConnetion() throws InterruptedException
	{
		Conlock.lock();
		try{
		while(pool.size()==0)
			{
			 T.await();
			}
		 Connection con=pool.get(0);  
		 pool.remove(0); 
		 return con;
		}
		finally
		{
			Conlock.unlock();
		}
	}
   
	//释放一个连接
	public void releaseConnetion(Connection con)
	{
		Conlock.lock();
		try{
		   pool.add(con);
		   T.signalAll();
		}
		finally
		{
		Conlock.unlock();
		}
	}
	
	
	
	//关闭连接池
	public synchronized void closePool()
	{
	  for(int i=0;i<pool.size();i++){
		try {
			((Connection)pool.get(i)).close();
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		 pool.remove(i);
	  }
		
	}
	
	//初始化
	private void init()
	{
		pool=new Vector<Connection>(initialSize);
		Conlock = new ReentrantLock();
	    T = Conlock.newCondition(); 
		readConfig();
		creatConnection();
		
	}
	
	//建立初始大小的连接池
	private  void creatConnection() 
	{
		Connection con=null;
		for(int i=0;i<initialSize;i++)
		{
			try {
				con=DriverManager.getConnection(url, username, password);
			} catch (SQLException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
			pool.add(con);
		}
	}
	
     // 读取设置连接池的属性文件
    
    private void readConfig() {
        try {
//这里路径由用户设置,可以设置为相对路径            
String path = "E:\\eclijobs\\SCStest\\dbpool.properties";

            FileInputStream is = new FileInputStream(path);
            Properties props = new Properties();
            props.load(is);
            this.driverClassName = props.getProperty("driverClassName");
            this.username = props.getProperty("username");
            this.password = props.getProperty("password");
            this.url = props.getProperty("url");
            this.initialSize = Integer.parseInt(props.getProperty("initialSize"));
            
        } catch (Exception e) {
            e.printStackTrace();
            System.out.print(System.getProperty("user.dir"));
            System.err.println("读取属性文件出错. ");        
        }
    }
	
	
	
	
}

下面是属性文件,针对的是Microsoft sql。

driverClassName=com.mysql.jdbc.Driver

username=root

password=123

url=jdbc\:mysql\://localhost\:3306/selectcourse?characterEncodering\=GBk

poolSize=10