`
酷的飞上天空
  • 浏览: 518549 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

使用的简易连接池

 
阅读更多

开始想使用c3p0最为底层的连接池,但想想还是算了。只是一个练习的小项目,还是手写一个简单点的吧。也给项目减少点体积,尽管那也大不了多少。

 

连接池嘛基本的也就是两个功能,取得连接、关闭连接。

下面贴出源码

public class DataSourceUtil {

	private static SimplePool connUtil;
	public static void init(String url,String user,String password){
		connUtil = new SimplePool(url,user,password);
	}
	public static Connection getConnection(){
		return connUtil.getConnection();
	}
	
	public static void close(Connection conn){
		connUtil.closeConnection(conn);
	}
	public static void closePool(){
		connUtil.shutDown();
	}
	//构造一个简易的连接池
	private static class SimplePool{
		String url,user,password;
		public SimplePool(String url,String user,String password){
			this.url = url;
			this.user = user;
			this.password = password;
			fillQueue();
		}
		private Queue<Connection> queue = new ArrayDeque<Connection>(); 
		//关闭此连接池,把剩余所有连接进行关闭
		void shutDown(){
			Connection conn= queue.poll();
			while(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					LogUtil.waring(SimplePool.class.getName(), "关闭与数据库的连接失败!");
				}
				conn=queue.poll();
			}
		}
		//将使用完成的Connection重新放回到队列
		synchronized void closeConnection(Connection conn){
			boolean b = false;
			try {
				b=conn.getAutoCommit();
				if(!b){
					conn.commit();
				}
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				LogUtil.waring(SimplePool.class.getName(), "将连接重新放回连接池失败!");
				fillQueue();
				return;
			}
			queue.offer(conn);
		}
		//使用得到的连接信息,构造Connection对象并填充到queue。
		void fillQueue(){
			//构造10个Connection对象并进行填充
			while(queue.size()<10){
				Connection conn=null;
				try {
					conn = DriverManager.getConnection(url, user, password);
				} catch (SQLException e) {
					LogUtil.error(SimplePool.class.getName(), "无法取得数据库连接,连接信息url:"+url+",user:"+user+",password:"+password);
					return;
				}	
				queue.add(conn);
			}
		}
		//取得Connection队列的第一个,并移除。没有则返回null
		 synchronized Connection getConnection(){
			 Connection conn = queue.poll();
			 if(conn==null) LogUtil.waring(SimplePool.class.getName(), "无法从一个空的连接池里面取得连接!");
			 return conn;
		 }
	}
}

 

为了调用方便就把几个方法定义成了static类型的

内部类SimplePool是主要实现的连接池功能,为了能供静态方法调用,所以也定义成了static

思路是

利用一个队列作为数据库连接的容器,当项目被加载的时候进行初始化(由BlogFilter调用),初始10个连接放入队列。

当有用户请求连接的时候则取得队列头部的连接返回,poll在返回连接的时候同时会把此对象此队列移出。

当关闭连接的时候则重新放回队列。

只是很简单的连接池实现,但是供练习用足够了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics