请问从数据库连接池中获得的一个连接在使用完成后需要close()吗?如果要不就和没用连接池一样了嘛。 数据库的session也会有timeout吧?不close,到时间connection应该会断的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要关闭的因为一般来说数据库缓冲池都用proxy之类的模式重写了Connection这时用close方法并不是真正关闭了数据库而是将该connection返回到数据库缓冲池如果不close,尽管过段时间会自动返回数据库缓冲池但在大量数据操作时,仍然可能引起缓冲池中没有可用连接,从而创建新连接使速度变慢所以要关闭 对,应为早期的连接池,是用类似freeConnection的另一个函数来归还连接池的,但是在一个team开发里面大家水平不齐,有些人调用连接池取得连接,而归还的时候关闭了连接(调用了conn.close()),这样造成了隐患,所以后来用动态代理等方式重写close。例如:public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object obj = null; //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态 if(CLOSE_METHOD_NAME.equals(m.getName())) setInUse(false); else obj = m.invoke(conn, args); //设置最后一次访问时间,以便及时清除超时的连接 lastAccessTime = System.currentTimeMillis(); return obj; } 如果你愿意的话,可以重载Connection的close()方法,在这个方法中把连接放回到连接池当然也可以不重载,自己另写一个方法,数据库使用完毕之后不close() 因为一般来说数据库缓冲池都用proxy之类的模式重写了Connection这时用close方法并不是真正关闭了数据库而是将该connection返回到数据库缓冲池////////////////////////////////////////////////////////////谁能给个重写Connection对象的close()函数的例子?如何才能实现以上效果? 建议楼上看一下JIVE的数据库连接池 to showmetheway(雪儿甜心)上面不是已经给你例子了么! Connection只是一个接口,当程序执行下面的语句时Connection conn = pc.getConnection(); 得到的是一个实现Connection接口的类,里面的具体的实现是你使用的数据库系统提供的JDBC驱动程序决定的。当你需要使用连接共享池的时候,在你的程序和jdbc驱动之间多了一层共享池,共享池实现Connection接口,共享池里面的代码如何处理conn.close()方法,你在外面是看不到的,它也许真的关闭了连接,也许只是给这个Connection加了一个标记,表示它处于空闲状态。不知道我的解释你是否明白,如果不明白,最好搞个共享池的源代码看看。 求助,一个题目,大神们求帮助了。。。 新手求解 关于数组问题 初学者问题 java中关于paint(),repaint()和paintComponent()之间的关系 急,如何将ascii码转换成字符啊? 在jsp中使用javabean不好用 替换字符串 java web开发实战1200例(第二卷)光盘内容(源代码、还有书上没有的几章内容) 用Java怎么实现文件搜索,实现核心是什么? 大虾救命啊!!!50分!!! 高分求救,单位让往上报个项目,郁闷死了! 紧急求助:如何实现java applet上的中文简体到繁体的转化?
因为一般来说
数据库缓冲池都用proxy之类的模式重写了Connection
这时用close方法
并不是真正关闭了数据库
而是将该connection返回到数据库缓冲池
如果不close,尽管过段时间会自动返回数据库缓冲池
但在大量数据操作时,仍然可能引起缓冲池中没有可用连接,从而创建新连接
使速度变慢
所以要关闭
另一个函数来归还连接池的,但是在一个team开发里面
大家水平不齐,有些人调用连接池取得连接,而归还的
时候关闭了连接(调用了conn.close()),这样造成了
隐患,所以后来用动态代理等方式重写close。例如:
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
Object obj = null;
//判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
if(CLOSE_METHOD_NAME.equals(m.getName()))
setInUse(false);
else
obj = m.invoke(conn, args);
//设置最后一次访问时间,以便及时清除超时的连接
lastAccessTime = System.currentTimeMillis();
return obj;
}
数据库缓冲池都用proxy之类的模式重写了Connection
这时用close方法
并不是真正关闭了数据库
而是将该connection返回到数据库缓冲池
////////////////////////////////////////////////////////////
谁能给个重写Connection对象的close()函数的例子?如何才能实现以上效果?
上面不是已经给你例子了么!
Connection conn = pc.getConnection();
得到的是一个实现Connection接口的类,里面的具体的实现是你使用的数据库系统提供的JDBC驱动程序决定的。
当你需要使用连接共享池的时候,在你的程序和jdbc驱动之间多了一层共享池,共享池实现Connection接口,共享池里面的代码如何处理conn.close()方法,你在外面是看不到的,它也许真的关闭了连接,也许只是给这个Connection加了一个标记,表示它处于空闲状态。
不知道我的解释你是否明白,如果不明白,最好搞个共享池的源代码看看。