首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

数据库连接池的简略实现

2012-12-26 
数据库连接池的简单实现?? ?自己的一个数据库作业的一部分,数据库连接池的简单实现,采取的是单例模式,同时

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

热点排行