连接池的释放是否恰当!
来源:互联网 发布:淘宝买东西寄到美国dhl 编辑:程序博客网 时间:2024/05/17 09:06
最近偶尔有个同事在tomcat連接池上提了一个疑问,引发我们部门地一番争论,但还是有分歧,不过通过一番查翻资料,疑点越来越集中,现在说说我的问题:
我们地统一点:
1.用户释放连接后,连接被回收到连接池,这个连接仍然是可用的。
如果一个连接等待了一段时间(连接池的最大空闲时间,可设置)仍然没有
人来请求连接,那么它将被彻底释放。当然,如果连接池中的连接个数已经
等于连接池的最小连接数(可设置),那么它不会被释放。
2.以tomcat连接池为例,tomcat启动后,假设我设置的最小连接数为5,那么这时候(此Tomcat下的程序没有启动)Tomcat是否和后台地数据库建立5条连线(session)呢?答案:不是.
3.我们的分歧点:注意第一点说的"用户释放连接后",什么叫用户释放连接,我把操作地页面关掉,还是在程序里调用conn.close,如果我在程序里面手动地close,那么我关闭的是连接池里的连接吗,还是把连接还给连接池,也就是说,我手动close连接是否有必要呢?
附上代码一段
- package com.dalong.connectionpool;
- import java.util.HashMap;
- import java.util.Vector;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.*;
- /**
- * <p>Title: </p>
- * <p>Description: test</p>
- * <p>Copyright: Copyright (c); 2003</p>
- * <p>Company: home</p>
- * @author dalong
- * @version 1.0
- */
- public class ConnectionPool {
- //连接池的管理器,首先初始化,仅仅有一个对象,管理连接池
- private static HashMap connectionPoolManager=new HashMap();;
- //没有用过的连接池,用vector实现同步
- private static Vector noUseConnectionPool;
- //没有用过的连接池
- private static HashMap nowUseConnectionPool;
- private static String dbDriver="odbc:jdbc:OdbcJdbcDriver";
- private static String dbUrl="dalong@XX";
- private static String userName="dalong";
- private static String userPassword="dalong";
- //默认为100个连接池
- private static int MAX_POOL=100;
- //singleTon 设计模式
- private ConnectionPool(String driver,String url,String name,String password,int max);
- throws ClassNotFoundException {
- Class.forName(driver);;
- dbUrl=url;
- userName=name;
- userPassword=password;
- MAX_POOL=max;
- }
- public static ConnectionPool getConnManagerInstance(String poolName);
- throws ClassNotFoundException{
- ConnectionPool tempPool=(ConnectionPool);connectionPoolManager.get(poolName);;
- if(tempPool==null);{
- tempPool=new ConnectionPool(dbDriver,dbUrl,userName,userPassword,MAX_POOL);;
- connectionPoolManager.put(poolName,tempPool);;
- return tempPool;
- }else
- return tempPool;
- }
- //通过连接池获得真正的链接
- public static Connection getConnection(); throws java.sql.SQLException{
- Connection conn=null;
- synchronized(noUseConnectionPool);{
- if(noUseConnectionPool.size();>0);{
- conn=(Connection);noUseConnectionPool.firstElement();;
- noUseConnectionPool.remove(conn);;
- return conn;
- }
- }
- //如果数据库连接池没有链接了,自己创建一个
- if(conn==null);{
- conn=createConnection(dbDriver,dbUrl,userName,userPassword);;
- }else if(conn.isClosed(););{
- nowUseConnectionPool.remove(conn);;
- conn=createConnection(dbDriver,dbUrl,userName,userPassword);;
- }
- conn.setAutoCommit(false);;
- nowUseConnectionPool.put(conn,conn);;
- return conn;
- }
- //如果连接池没有链接了,就需要产生一个链接
- private static Connection createConnection(String driver,String url,String user,String password);
- throws java.sql.SQLException{
- Connection conn=DriverManager.getConnection(url,user,password);;
- return conn;
- }
- public static void releaseConnection(Connection conn,boolean isCommit);
- throws java.sql.SQLException{
- if(isCommit);
- conn.commit();;
- else
- conn.rollback();;
- nowUseConnectionPool.remove(conn);;
- if(noUseConnectionPool.size(); + nowUseConnectionPool.size();<MAX_POOL);{
- synchronized(noUseConnectionPool);{
- noUseConnectionPool.add(conn);;
- }
- }else{
- conn.close();;
- }
- }
- public static void main(String[] args); {
- //测试模拟10个客户
- for (int i = 0; i < 10; i++); {
- try {
- //xxxx 一般为属性文件读取
- ConnectionPool pool = ConnectionPool.getConnManagerInstance("xxxx");;
- Connection conn = pool.getConnection();;
- }catch (SQLException ex1); {
- //处理异常
- }
- catch (ClassNotFoundException ex); {
- //处理异常
- }
- }
- }
- }
- 连接池的释放是否恰当!
- mysql连接池, 连接的释放, 连接的回收, 连接释放机制
- Proxool连接池的释放问题
- TCP连接的释放
- 无法释放连接的问题
- mysql的连接与释放
- TCP的连接和释放
- TCP的连接和释放
- TCP的连接和释放
- Proxool连接池的释放问题(转)
- Spring配置DBCP连接池不能释放的问题
- 制定恰当的团队架构
- 使用C3P0连接池释放当前连接
- Spring+hibernate中不能释放tomcat连接池中连接的解决办法
- 连接无法释放导致的程序问题解决
- 三次握手建立的连接如何释放?
- proc oracle 连接释放不了的问题
- TCP建立与释放连接的过程
- 什么是Jython
- asp.net母板页引用文件的路径问题
- HookAPI函数
- shell小知识点
- malloc calloc realoc
- 连接池的释放是否恰当!
- 快速写入Excel(将数据转换为二维数组,再使用Range方法)
- 嵌入式人才的发展方向!(转贴)
- 关于SQL Server2000连接服务器时提示:无效的连接,ConnectionOpen(Invalid Instance())的解决方案
- 实现CSS跨浏览器
- 挚友如茶
- Linux 配置JDK和Tomcat
- 技术创新推进产业结构调整
- Instruments on Leopard: How to debug those random crashes in your Cocoa app