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