C3P0连接池,大家使用完连接后是如何处理连接的?

keyong19ryry 2010-04-01 10:28:16
是使用完后就直接关闭了吗?

...全文
6933 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurunhui 2012-10-25
  • 打赏
  • 举报
回复
alitoto 2012-03-18
  • 打赏
  • 举报
回复
学习一下。看看是否线程安全。
lyl290932857 2011-12-12
  • 打赏
  • 举报
回复
火龙果大哥 才是真牛人。
fangxu2006 2011-07-06
  • 打赏
  • 举报
回复
15555555555555555
dinghun8leech 2010-04-08
  • 打赏
  • 举报
回复
如果close方法在c3p0中作为还回连接的方法,那么这个方法的签名就太不严谨了,极易引起误会。
LuffySY 2010-04-02
  • 打赏
  • 举报
回复
学习了。。。火龙果大哥。。
NOKIA5320XM 2010-04-02
  • 打赏
  • 举报
回复
膜拜火龙果
injuer 2010-04-01
  • 打赏
  • 举报
回复
连接超时才会关闭,连接池关闭会报C3P0的连接关闭异常,目前已经不推荐使用C3P0了,因为C3P0容易是线程处于死锁,占用与数据库的连接..........

使用完后是把连接放回连接池中,也就是按毫秒数暂停此线程的运行,通过比对连接池的配置文件中的连接时间,超过才销毁...

任何连接池的连接,销毁就不会在创建...
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 keyong19ryry 的回复:]
我说的是java.sql.Connection,使用完后直接掉Connection.close()关闭吗?还是有其它方式释放?
[/Quote]

使用 c3p0 的话,也是 java.sql.Connection,只要是 JDBC 都是这个接口的对象!

使用完后必须 con.close() 掉,使用连接池的话,执行 con.close 并不会关闭与数据库的 TCP 连接,而是将连接还回到池中去,如果不 close 掉的话,这个连接将会一直被占用,直接连接池中的连接耗尽为止。

至于是如何做到 con.close 并不是真正意义上的关闭连接?而是直接将连接还回到池中去?

一般有两种方式:

一:使用装饰器模式,在装饰器构造中传入一个真正的 Connection,这个装饰器实现 Connection,使用构造 传入 Connection 委托重写所有方法,并改写 close 方法:

public class ConnectionDecorator implements Connection {

private Connection con = null;

public ConnectionDecorator(Connection con) {
this.con = con;
}

public void close() throws SQLException {
// 重写!
}

public void commit() throws SQLException {
this.con.commit();
}

public Statement createStatement() throws SQLException {
return this.con.createStatement();
}

public Statement createStatement(int resultSetType, int resultSetConcurrency)
throws SQLException {
return this.con.createStatement(resultSetType, resultSetConcurrency);
}

......
}


然后经过连接池控制的 Connection 对象都使用该装饰器进行包装

二:动态代理:

使用动态代理重新实现 close 方法,每个获得 Connection 是一个代理后的对象。


一个完善的连接池,其架构设计非常复杂,Connection#close 问题就是连接池诸多设计难点当中的一个。
injuer 2010-04-01
  • 打赏
  • 举报
回复
使用连接池了,为啥还要自己去关心连接????

楼主没手动JDBC,自然不同关闭了..........
dinghun8leech 2010-04-01
  • 打赏
  • 举报
回复
连接池负责维护连接,我们只管用,当然不用关注连接关闭的问题。
keyong19ryry 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 injuer 的回复:]
连接超时才会关闭,连接池关闭会报C3P0的连接关闭异常,目前已经不推荐使用C3P0了,因为C3P0容易是线程处于死锁,占用与数据库的连接..........

使用完后是把连接放回连接池中,也就是按毫秒数暂停此线程的运行,通过比对连接池的配置文件中的连接时间,超过才销毁...

任何连接池的连接,销毁就不会在创建...
[/Quote]

我说的是java.sql.Connection,使用完后直接掉Connection.close()关闭吗?还是有其它方式释放?
dinghun8leech 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 apollo_ts 的回复:]
我是不管呀!哈哈!!
[/Quote]
+1
BigBird2012 2010-04-01
  • 打赏
  • 举报
回复
C3P0容易出现死锁吗?我对此连接池的实现不太清楚,请高手说说。
APOLLO_TS 2010-04-01
  • 打赏
  • 举报
回复
我是不管呀!哈哈!!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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