昨天我在写程序的时候又遇到棘手的问题---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的,可是,别美,你现在就保不齐擦没擦屁股呢!
分享到:
相关推荐
jdbc连接数据库 jdbc连接数据库 jdbc连接数据库 jdbc连接数据库 jdbc连接数据库
JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试...
jdbc连接大全,很有用的,经自己精心总结!!
jdbc 连接impala或者jdbc连接hive所需的jar包。
关于jdbc连接池连接数据库的原理
JDBC连接Oracle数据库常见问题及解决方法
jdbc连接驱动大全
JDBC连接Mysql数据库案例,共有两个表,分装好了JDBC连接的步骤代码
JDBC连接各种数据库大全 JDBC连接DB2 JDBC连接Microsoft SQLServer(microsoft) JDBC连接Sybase JDBC连接MySQL JDBC连接PostgreSQL JDBC连接Oracle JDBC连接ODBC
JDBC常用连接串JDBC常用连接串
jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc连接数据库jdbc...
JDBC连接数据库工具类 JDBC 连接数据库 ORACLE SQLSERVER MYSQL ORACLE 已测 OK 欢迎大家反馈 我的微博是: http://weibo.com/namenode
在Eclipse中用JDBC连接MySQL数据库!.txt
使用JDBC连接Oracle数据库使用JDBC连接Oracle数据库
jdbc数据库连接池,方便连接数据库,优化数据库连接速度。
Tongweb5中配置JDBC连接池的文档。Web应用通过JNDI获取Tongweb配置的JDBC数据源(连接池
jdbc对汉字的支持欠佳,informix的数据库,用jdbc连接后,汉字显示乱码,有人说用字符转换的方式可以解决,但是如果每个查询都转换,是个很麻烦的事情,经过搜索,对别人的方法加以改进,总算有个比较满意的方法可以...
关于JDBC连接oracle数据库的步骤实例,新手可以借鉴,第一步加载驱动的时候可以用DriverManager或者Class.forName,下面注释掉的都是正确的代码,新手可以看看,高手勿喷
里面详细记录了JDBC连接数据库方法的文档,并附有示例
jdbc java 数据库 连接数据库 步骤