免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 889 | 回复: 0
打印 上一主题 下一主题

DBConnectionManager --分析鉴赏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-14 18:58 |只看该作者 |倒序浏览

package zpxx;
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,String customer)
{
  DBConnectionPool pool=(DBConnectionPool)pools.get(name);
  if(pool!=null)
  {
   return pool.getConnection(customer);
  }
  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());
   }
  }
}
public synchronized void release(String customer)
{
//  if(--clients!=0)
//   return;
  Enumeration allPools=pools.elements();
  while(allPools.hasMoreElements())
  {
   DBConnectionPool pool=(DBConnectionPool)allPools.nextElement();
   pool.release(customer);
  }
  Enumeration allDrivers=drivers.elements();
  while(allDrivers.hasMoreElements())
  {
   Driver driver=(Driver)allDrivers.nextElement();
   try
   {
    DriverManager.deregisterDriver(driver);
    log(customer+"撤消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||checkOut0)
   {
    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=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();
  }
  public void release(String customer)
  {
   Enumeration allConnections=freeConnections.elements();
   while(allConnections.hasMoreElements())
   {
    Connection con=(Connection)allConnections.nextElement();
    try
    {
     con.close();
     log(customer+"关闭连接池"+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;
  }
  private Connection newConnection(String customer)
  {
   Connection con=null;
   try
   {
    con=DriverManager.getConnection(URL,user,password);
    log(customer+"从连接池"+name+"创建一个新的连接");
   }
   catch(SQLException e)
   {
    log(e,"无法创建下列URL的连接"+URL);
    return null;
   }
   return con;
  }
}
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18783/showart_442502.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP