日期:2014-05-18  浏览次数:20766 次

连接池占用资源问题
本人第一次采用链接池链接数据库,可发现占用内存相当大。为什么会这样呢?
我的链接池代码如下:望各位高手指点一二!
package   com.nc138.util;

import   java.io.*;
import   java.sql.*;
import   java.util.*;
import   java.util.Date;

public   class   DBConnectionManager   {
static   private   DBConnectionManager   instance;   //   唯一实例

static   private   int   clients;

private   Vector   drivers   =   new   Vector();

private   PrintWriter   log;

private   Hashtable   pools   =   new   Hashtable();

Statement   stmt   =   null;

ResultSet   rs   =   null;

/**
  *   返回唯一实例.如果是第一次调用此方法,则创建实例
  *
  *   @return   DBConnectionManager   唯一实例
  **/
static   synchronized   public   DBConnectionManager   getInstance()   {
if   (instance   ==   null)   {
instance   =   new   DBConnectionManager();
}
clients++;
return   instance;
}

/**
  *   建构函数私有以防止其它对象创建本类实例
  */
private   DBConnectionManager()   {
init();
}

/**
  *   将连接对象返回给由名字指定的连接池
  *
  *   @param   name   在属性文件中定义的连接池名字
  *   @param   con   连接对象
  **/
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;
}

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 &n