连接池的释放是否恰当!

来源:互联网 发布:淘宝买东西寄到美国dhl 编辑:程序博客网 时间:2024/05/17 09:06

最近偶尔有个同事在tomcat連接池上提了一个疑问,引发我们部门地一番争论,但还是有分歧,不过通过一番查翻资料,疑点越来越集中,现在说说我的问题:
我们地统一点:
1.用户释放连接后,连接被回收到连接池,这个连接仍然是可用的。
如果一个连接等待了一段时间(连接池的最大空闲时间,可设置)仍然没有
人来请求连接,那么它将被彻底释放。当然,如果连接池中的连接个数已经
等于连接池的最小连接数(可设置),那么它不会被释放。

2.以tomcat连接池为例,tomcat启动后,假设我设置的最小连接数为5,那么这时候(此Tomcat下的程序没有启动)Tomcat是否和后台地数据库建立5条连线(session)呢?答案:不是.

3.我们的分歧点:注意第一点说的"用户释放连接后",什么叫用户释放连接,我把操作地页面关掉,还是在程序里调用conn.close,如果我在程序里面手动地close,那么我关闭的是连接池里的连接吗,还是把连接还给连接池,也就是说,我手动close连接是否有必要呢?

 

附上代码一段

  1. package com.dalong.connectionpool;  
  2. import java.util.HashMap;  
  3. import java.util.Vector;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.*;  
  7. /** 
  8.  * <p>Title: </p> 
  9.  * <p>Description: test</p> 
  10.  * <p>Copyright: Copyright (c); 2003</p> 
  11.  * <p>Company: home</p> 
  12.  * @author dalong 
  13.  * @version 1.0 
  14.  */  
  15.   
  16. public class ConnectionPool {  
  17.   
  18.   //连接池的管理器,首先初始化,仅仅有一个对象,管理连接池  
  19.   private static HashMap connectionPoolManager=new HashMap();;  
  20.   //没有用过的连接池,用vector实现同步  
  21.   private static Vector noUseConnectionPool;  
  22.   //没有用过的连接池  
  23.   private  static HashMap nowUseConnectionPool;  
  24.   
  25.   private  static String dbDriver="odbc:jdbc:OdbcJdbcDriver";  
  26.   private  static String dbUrl="dalong@XX";  
  27.   private  static String userName="dalong";  
  28.   private  static String userPassword="dalong";  
  29.   
  30.   //默认为100个连接池  
  31.   private  static int MAX_POOL=100;  
  32.   
  33.  //singleTon 设计模式  
  34.   private ConnectionPool(String driver,String url,String name,String password,int max);  
  35.      throws ClassNotFoundException {  
  36.       Class.forName(driver);;  
  37.       dbUrl=url;  
  38.       userName=name;  
  39.       userPassword=password;  
  40.       MAX_POOL=max;  
  41.  }  
  42.  public static ConnectionPool getConnManagerInstance(String poolName);  
  43.       throws ClassNotFoundException{  
  44.      ConnectionPool tempPool=(ConnectionPool);connectionPoolManager.get(poolName);;  
  45.      if(tempPool==null);{  
  46.         tempPool=new ConnectionPool(dbDriver,dbUrl,userName,userPassword,MAX_POOL);;  
  47.         connectionPoolManager.put(poolName,tempPool);;  
  48.         return tempPool;  
  49.      }else  
  50.        return tempPool;  
  51.  }  
  52.   
  53.  //通过连接池获得真正的链接  
  54.  public static Connection getConnection(); throws java.sql.SQLException{  
  55.     Connection conn=null;  
  56.     synchronized(noUseConnectionPool);{  
  57.        if(noUseConnectionPool.size();>0);{  
  58.          conn=(Connection);noUseConnectionPool.firstElement();;  
  59.          noUseConnectionPool.remove(conn);;  
  60.         return conn;  
  61.        }  
  62.     }  
  63.     //如果数据库连接池没有链接了,自己创建一个  
  64.     if(conn==null);{  
  65.        conn=createConnection(dbDriver,dbUrl,userName,userPassword);;  
  66.     }else if(conn.isClosed(););{  
  67.        nowUseConnectionPool.remove(conn);;  
  68.        conn=createConnection(dbDriver,dbUrl,userName,userPassword);;  
  69.       }  
  70.     conn.setAutoCommit(false);;  
  71.     nowUseConnectionPool.put(conn,conn);;  
  72.     return conn;  
  73.  }  
  74.   
  75.  //如果连接池没有链接了,就需要产生一个链接  
  76.  private static Connection createConnection(String driver,String url,String user,String password);  
  77.        throws java.sql.SQLException{  
  78.      Connection conn=DriverManager.getConnection(url,user,password);;  
  79.      return conn;  
  80.  }  
  81.  public static void releaseConnection(Connection conn,boolean isCommit);  
  82.     throws java.sql.SQLException{  
  83.     if(isCommit);  
  84.        conn.commit();;  
  85.     else  
  86.        conn.rollback();;  
  87.     nowUseConnectionPool.remove(conn);;  
  88.        if(noUseConnectionPool.size(); + nowUseConnectionPool.size();<MAX_POOL);{  
  89.           synchronized(noUseConnectionPool);{  
  90.             noUseConnectionPool.add(conn);;  
  91.           }  
  92.        }else{  
  93.          conn.close();;  
  94.        }  
  95.  }  
  96.   
  97.  public static void main(String[] args); {  
  98.   //测试模拟10个客户  
  99.    for (int i = 0; i < 10; i++); {  
  100.      try {  
  101.        //xxxx 一般为属性文件读取  
  102.        ConnectionPool pool = ConnectionPool.getConnManagerInstance("xxxx");;  
  103.        Connection conn = pool.getConnection();;  
  104.   
  105.      }catch (SQLException ex1); {  
  106.         //处理异常  
  107.       }  
  108.      catch (ClassNotFoundException ex); {  
  109.         //处理异常  
  110.      }  
  111.    }  
  112.  }  
  113. }
原创粉丝点击