请问从数据库连接池中获得的一个连接在使用完成后需要close()吗?如果要不就和没用连接池一样了嘛。

showmetheway 2003-08-23 11:57:50
import java.sql.*;
import javax.sql.*;
// import here vendor specific JDBC drivers
public ProductPK ejbCreate() {
try {
// initialize JNDI lookup parameters
Context ctx = new InitialContext(parms);
...
ConnectionPoolDataSource cpds = (ConnectionPoolDataSource)ctx.lo
okup(cpsource);
...
// Following parms could all come from a JNDI look-up
cpds.setDatabaseName("PTDB");
cpds.setUserIF("XYZ");
...
PooledConnection pc = cpds.getPooledConnection();
Connection conn = pc.getConnection();
...
// do business logic
conn.close(); //大家来说说看这里的conn是否应该关闭呢?如果关闭了等于连接池里少了一个已经建立的连接对象,下次再有连接数据库请求时岂不是还要再重新建立一个数据库连接从而导致效率的降低违反了连接池的最终目的?
}
...
}
...全文
892 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyycyu 2003-08-25
  • 打赏
  • 举报
回复
to showmetheway(雪儿甜心)
上面不是已经给你例子了么!
remanwang 2003-08-25
  • 打赏
  • 举报
回复
Connection只是一个接口,当程序执行下面的语句时
Connection conn = pc.getConnection();
得到的是一个实现Connection接口的类,里面的具体的实现是你使用的数据库系统提供的JDBC驱动程序决定的。
当你需要使用连接共享池的时候,在你的程序和jdbc驱动之间多了一层共享池,共享池实现Connection接口,共享池里面的代码如何处理conn.close()方法,你在外面是看不到的,它也许真的关闭了连接,也许只是给这个Connection加了一个标记,表示它处于空闲状态。
不知道我的解释你是否明白,如果不明白,最好搞个共享池的源代码看看。
flyycyu 2003-08-23
  • 打赏
  • 举报
回复
对,应为早期的连接池,是用类似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;
}
wl_95421 2003-08-23
  • 打赏
  • 举报
回复
要关闭的
因为一般来说
数据库缓冲池都用proxy之类的模式重写了Connection
这时用close方法
并不是真正关闭了数据库
而是将该connection返回到数据库缓冲池
如果不close,尽管过段时间会自动返回数据库缓冲池
但在大量数据操作时,仍然可能引起缓冲池中没有可用连接,从而创建新连接
使速度变慢
所以要关闭
cshchina 2003-08-23
  • 打赏
  • 举报
回复
数据库的session也会有timeout吧?
不close,到时间connection应该会断的
joyrush 2003-08-23
  • 打赏
  • 举报
回复

不是的 如果我没有理解错的话.
连接池会不停检查自己的池中连接数目
如果发现比最小的预定数目还要小的话
他自己会去申请连接的

盼高手指点....

ewingchen 2003-08-23
  • 打赏
  • 举报
回复
建议楼上看一下JIVE的数据库连接池
showmetheway 2003-08-23
  • 打赏
  • 举报
回复
因为一般来说
数据库缓冲池都用proxy之类的模式重写了Connection
这时用close方法
并不是真正关闭了数据库
而是将该connection返回到数据库缓冲池
////////////////////////////////////////////////////////////
谁能给个重写Connection对象的close()函数的例子?如何才能实现以上效果?
bromon 2003-08-23
  • 打赏
  • 举报
回复
如果你愿意的话,可以重载Connection的close()方法,在这个方法中把连接放回到连接池

当然也可以不重载,自己另写一个方法,数据库使用完毕之后不close()

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧