類的呼叫問題,對付大量程式碼中資料庫連線未及時釋放的程式碼維護問題

xlongbuilder發表於2005-01-11
背景:

檔案
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!

相關文章