关于JDBC连接释放的问题,转载一篇不错的文章!

昨天我在写程序的时候又遇到棘手的问题---JDBC的链接关闭不完全,导致不断占用connection pool的链接不断被占用,刷新页面几次,最后占满了connection pool以后,自然就读不出数据或者报错了。我搞了半天搞不懂个所以然,直到下班没有把问题解决,以前我在写程序的时候都曾经遇到过这个问题,可以最后还是没有搞下去。于是今天上班再上网找资料的时候,发现一篇写得不错的文章,虽然比喻有点那个。。。。不过真的写得不错。
尊重原著,以下文章转载自:JAVAEYE软件开发交流社区

题目:你擦了吗?确定擦了?真的确定擦了?
java的try-finally给我们提供了一个“保证某个动作必然执行”的机会。
一个try-finally结构,只要try块开始执行了,finally块里面的代码保证执行一次并且只有一次。
打个比方,就象你上厕所,只要你一旦开始拉了,我们保证无论如何,是拉稀了也好,放屁了也罢,最终你肯定是擦了屁股走出卫生间。
应用try-finally,我们可以在异常满天飞的程序里保证我们的关键资源被按时正确清理。一个最常见的应用就是jdbc的Connection, Statement, ResultSet等。
但是,我最近惊奇地发现,不知道怎么正确清理资源的人大有人在,即使是一些java老手。
看一个例子先:
void f(){
Connection conn = ...;
Statement stmt = conn.createStatement();
ResultSet rset = ...;
...
}



典型的jdbc程序。但是也是典型的光着屁股,其臭如兰地走出厕所的典范。哎,你擦屁股了吗?
有的哥们振振有辞:我不用管,我的jdbc driver/我的应用服务器/garbage collector会处理的。
这是典型的糊涂蛋逻辑。没有close(),jdbc driver, 应用服务器怎么知道你是拉完了,还是光着屁股出去接个电话先?难不成这driver都智能地会算命了?
garbage collector倒确实管得了。不过,garbage collector不一定运行啊。你要是有10G得内存,要是你的程序就用了10M,garbage collector说不定就一直睡大觉。而且,就算它管,也许等你光着屁股上班被警察抓 起来之后才匆匆赶到,你等的起吗?
好,有人说,那我擦,我擦,我擦擦擦。行了吧?

void f(){
Connection conn = ...;
Statement stmt = conn.createStatement();
ResultSet rset = ...;
rset.close();
conn.close();
...
}


呵呵。我的傻哥们,你只擦了靠近后背的那三公分,剩下的嘛,别人看不见你就乐得省土块儿了是么?
按jdbc标准,ResultSet, Statement, Connection都要close(),也许有的driver会在Connection关闭的时候同时正确清理ResultSet, Statement,但是,并没有一条规定让所有的driver都这么做。
另外,也许你的Connection是从一个池里面来的,它只是回到池中去,如果你不关闭Statement, ResultSet,下一个拿到这个Connection的人也许就倒霉了!
做事要有始有终,既然开始擦了,就擦干净点儿,行不?(那个,谁谁谁,借我个防毒面具先!)
ok,有个讲卫生的小傻子这样擦:

void f(){
Connection conn = ...;
Statement stmt = conn.createStatement();
ResultSet rset = ...;
rset.close();
stmt.close();
conn.close();
...
}


然后洋洋得意地说:我是好孩子,我天天擦屁屁。

是啊,多听话的孩子呀。可惜,某天,这孩子正坐在马桶上美着呢,妈妈喊了嗓子:二傻子,吃饭啦。
哦!吃饭。二傻子裤子都没提就窜出来了,熏得妈妈一个跟头。
什么问题,傻子做事一根筋,不能打扰,一旦有异常情况出现,屁股就忘了擦了。
所以,我这里郑重提醒大家,请用"try-finally"!它独有凹槽,防止侧漏...(糟了,串台了)
是啊,java老手们都不是傻子,都知道用try-finally的,可是,别美,你现在就保不齐擦没擦屁股呢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值