当前位置:首页 > 开发 > 编程语言 > 数据库连接池 > 正文

使用的简易连接池

发表于: 2010-05-24   作者:酷的飞上天空   来源:转载   浏览:
摘要: 开始想使用c3p0最为底层的连接池,但想想还是算了。只是一个练习的小项目,还是手写一个简单点的吧。也给项目减少点体积,尽管那也大不了多少。   连接池嘛基本的也就是两个功能,取得连接、关闭连接。 下面贴出源码 public class DataSourceUtil { private static SimplePool connUtil; public static

开始想使用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在返回连接的时候同时会把此对象此队列移出。

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

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

使用的简易连接池

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
What is Connection Pool?看图~~ 1)存放Connection对象的容器; 2)减少连接数据库的开销; 3)程序
Subversion名片: Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以
封装NSMapTable并简易的使用 NSMapTable是弱引用的字典,可以用来存储对象,该对象消失了也没有关系,
网上搜集加自己整理, 所以无法注明出处,请原作者见谅. 一. 安装步骤 1.安装SubVersion,只需安装在服
Subversion名片: Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以
安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹,打开,然
事务的概念 1)每种数据库都有事务的支持,但支持强度不同 2)以MySQL为例, 启动事务 start transact
1、回顾数据库的基本用法 * 加载驱动:Class.forName().newInstance;//在JVM内加载了驱动 e.g:Class
为什么要使用HttpClient池? 都知道如果单纯使用HttpClient去抓取一个网站的内容时,会消耗在请求连
教程使用的是Tomcat5.x,进入Tomcat界面可以直接配置DataSource,我的是Tomcat6.x,登录Tomcat后发
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号