数据库连接池的简单实现
?? ?自己的一个数据库作业的一部分,数据库连接池的简单实现,采取的是单例模式,同时采用了同步锁机制。关于单例模式大家可以参考《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