类的调用问题,对付大量代码中数据库连接未及时释放的代码维护问题

05-01-11 xlongbuilder
背景:

文件
jsp >1000 内嵌大量java代码
class>200
经过n多人的n次修改,问题很多
主要是数据库未及时释放的为主要

思路:

所有的jsp 和 class 共享一个数据库连接池
想通过修改DBconnionmanager类的
两个方法
getConnection();
纪录连接文件名

freeConnection();
得到文件名比较得到未释放连接的文件名

要求不修改jsp文件

现在主要是不知道如何得到文件名
得到编译过的servlet名字好像也行

jsp 调用方法:


DBConnectionManager connMgr = null;
Statement sqlStmt = null;
ResultSet sqlRst2 =null;
Connection conn = null;
  try{
	 connMgr = DBConnectionManager.getInstance();
	conn=connMgr.getConnection("voice");
			
        sqlStmt2 = conn.createStatement();
        sqlStmt2.executeUpdate(strSql);
   }
	
finally{
		
	connMgr.freeConnection("voice",conn);
	if (!conn.isClosed())conn.close();
	conn = null;
			
			
}
<p class="indent">




DBConnectionManager.java


/**
 * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接
 * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.
 */
public class DBConnectionManager
{
  static private DBConnectionManager instance; // 唯一实例

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



  /**
   * 将连接对象返回给由名字指定的连接池
   *
   * @param name 在属性文件中定义的连接池名字
   * @param con 连接对象
   */
  public void freeConnection(String name, Connection con)
  {
    if (con == null)
    {
      System.out.println("connection is null");
    }
    try
    {
      con.setAutoCommit(true);
      ConnectionPool pool = (ConnectionPool) pools.get(name);
      String connName = "Unknown"; //连接名未知
      if (pool != null)
      {
        //if(isDebug) System.out.println("连接池释放连接:Unknown" + " -");
        con.close();
      }
    }
    catch (Exception e)
    {
    }
  }



  public Connection getConnection(String name)
  {
    ConnectionPool pool = (ConnectionPool) pools.get(name);
//    String connName = "Unknown";
    try
    {
      if (pool != null)
      {
        //System.err.println('1');
        return pool.getConnection();

      }
      //System.err.println('2');
      return null;
    }
    catch (Exception e)
    {
      e.printStackTrace();
      //System.err.println('3');
      return null;
    }
  }

}

<p class="indent">


请高手至招 thanks!

SportsBaby1980
2005-01-11 14:00
呵呵 都那么多问题le

还不推倒重来啊?

结构也弄得更合理些

前后分割
业务数据表示分割

基本就行了

相应的问题就迎刃而解

xlongbuilder
2005-01-11 22:31
不行啊 现在还有
十几个版本正在使用中阿
我们暂时还没有哪么多人
来开发下一个版本
再想想其他办法吧!!