| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1025 人关注过本帖
标题:[转帖]数据库的连接池(经典的那种)
取消只看楼主 加入收藏
寒星
Rank: 1
等 级:新手上路
帖 子:455
专家分:0
注 册:2004-6-7
收藏
 问题点数:0 回复次数:0 
[转帖]数据库的连接池(经典的那种)

package com.jewes; import java.io.*; import java.sql.*; import java.util.*; import java.util.Date;

//建立DBConnectionManager public class DBConnectionManager {static private DBConnectionManager instance; static private int clients;

private Vector drivers=new Vector(); private PrintWriter log; private Hashtable pools=new Hashtable();

//返回唯一的实列 static synchronized public DBConnectionManager getInstance() {if(instance==null) {instance=new DBConnectionManager(); } clients++; return instance; }

//构造函数! private DBConnectionManager() {init(); } //结束构造函数 //释放一个连接 public void freeConnection(String name,Connection con) {DBConnectionPool pool=(DBConnectionPool)pools.get(name); if(pool!=null) {pool.freeConnection(con); } } //结束释放一个连接

//取得一个连接 public Connection getConnection(String name) {DBConnectionPool pool=(DBConnectionPool)pools.get(name); if(pool!=null) {return pool.getConnection(); } return null; }

public Connection getConnection(String name,long time) {DBConnectionPool pool=(DBConnectionPool)pools.get(name); if(pool!=null) {return pool.getConnection(time); } return null; } //结束getconnection //关闭所有连接 public synchronized void release() { {if(--clients!=0) return; } Enumeration allPools=pools.elements(); while(allPools.hasMoreElements()) {DBConnectionPool pool=(DBConnectionPool)allPools.nextElement(); pool.release(); } Enumeration allDrivers=drivers.elements(); while(allDrivers.hasMoreElements()) {Driver driver=(Driver)allDrivers.nextElement(); try {DriverManager.deregisterDriver(driver); log("撤消JDBC驱动程序"+driver.getClass().getName()); } catch(SQLException e) {log(e,"无法撤消JDBC驱动程序的注册"+driver.getClass().getName()); } } } private void createPools(Properties props) {Enumeration propNames=props.propertyNames(); while(propNames.hasMoreElements()) {String name=(String) propNames.nextElement(); if(name.endsWith(".url")) {String poolName=name.substring(0,name.lastIndexOf(".")); String url=props.getProperty(poolName+".url"); if(url==null) {log("没有连接池"+poolName+"指定的URL"); continue; } String user=props.getProperty(poolName+".user"); String password=props.getProperty(poolName+".password"); String maxconn= props.getProperty(poolName+".maxconn","0"); int max; try {max=Integer.valueOf(maxconn).intvalue(); } catch(NumberFormatException e) {log("错误的最大连接数:"+maxconn+".连接池"+poolName); max=0; } DBConnectionPool pool=new DBConnectionPool(poolName,url,user,password,max); pools.put(poolName,pool); log("成功创建连接池"+poolName); } } }

private void init() {InputStream is=getClass().getResourceAsStream("/db.properties"); Properties dbProps=new Properties(); try {dbProps.load(is); } catch(Exception e) {System.err.println("不能读取属性文件。请确保db.properties在你的CLASSPATH中"); return; } String logFile=dbProps.getProperty("logfile","DBConnectionManager.log"); try {log=new PrintWriter(new FileWriter(logFile,true),true); } catch(IOException e) {System.err.println("无法打开日志文件:"+logFile); log=new PrintWriter(System.err); } loadDriver(dbProps); createPools(dbProps); }

private void loadDriver(Properties props) {String driverClasses=props.getProperty("drivers"); StringTokenizer st=new StringTokenizer(driverClasses); while(st.hasMoreElements()) {String driverClassName=st.nextToken().trim(); try {Driver driver=(Driver)Class.forName(driverClassName).newInstance(); DriverManager.registerDriver(driver); drivers.addElement(driver); log("成功注册驱动程序"+driverClassName); } catch(Exception e) {log("无法注册驱动程序:"+driverClassName+",错误"+e); } } }

private void log(String msg) {log.println(new Date()+":"+msg); } private void log(Throwable e,String msg) {log.println(new Date()+":"+msg); e.printStackTrace(log); } class DBConnectionPool {private int checkOut; private Vector freeConnections=new Vector(); private int maxconn; private String name; private String password; private String URL; private String user;

public DBConnectionPool(String name,String URL,String user,String password,int maxconn) {this.name=name; this.URL=URL; this.password=password; this.user=user; this.maxconn=maxconn; } public synchronized void freeConnection(Connection con) {freeConnections.addElement(con); checkOut--; notifyAll(); } public synchronized Connection getConnection() {Connection con=null; if(freeConnections.size()>0) {con=(Connection)freeConnections.firstElement(); freeConnections.removeElementAt(0); try {if(con.isClosed()) {log("从连接池"+name+"删除一个连接"); con=getConnection(); } } catch(SQLException e) {log("从连接池"+name+"删除一个连接"); con=getConnection(); } } else if(maxconn==0||checkOut<maxconn) {con=newConnection(); } if(con!=null) {checkOut++; } return con; }

public synchronized Connection getConnection(long timeout) {long startTime=new Date().getTime(); Connection con; while((con=getConnection())==null) { try {wait(timeout); } catch(InterruptedException e) {} if((new Date().getTime()-startTime)>=timeout) {return null; } } return con; } public void release() {Enumeration allConnections=freeConnections.elements(); while(allConnections.hasMoreElements()) {Connection con=(Connection)allConnections.nextElement(); try {con.close(); log("关闭连接池"+name+"中的连接"); } catch(SQLException e) {log(e,"无法关闭连接池"+name+"中的连接"); } } freeConnections.removeAllElements(); } private Connection newConnection() {Connection con=null; try {con=DriverManager.getConnection(URL,user,password); log("连接池"+name+"创建一个新的连接"); } catch(SQLException e) {log(e,"无法创建下列URL的连接"+URL); return null; } return con; } } }

搜索更多相关主题的帖子: 数据库 import java 经典 
2004-06-20 11:02
快速回复:[转帖]数据库的连接池(经典的那种)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025703 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved