CSDN博客

img yuanqingfei

数据库连接池

发表于2004/7/10 17:27:00  898人阅读

完整程序 -> 数据库的连接池(经典的那种) 
软件名称: 数据库的连接池(经典的那种)
提交时间: 2002-06-08
作者: jewes
提交人: 本站提供 
相关网址: jewes.sharella.com 
点击次数: 4628 
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;
}
}
}

0 0

相关博文

我的热门文章

img
取 消
img