昨天我在写程序的时候又遇到棘手的问题---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的,可是,别美,你现在就保不齐擦没擦屁股呢!
分享到:
相关推荐
在IT行业中,数据库连接管理是应用系统性能优化的关键环节之一,而JDBC连接池就是解决这一问题的有效工具。本文将详细讲解JDBC连接池的工作原理、配置方法以及如何通过优化来提升连接速度。 JDBC(Java Database ...
本篇内容将深入探讨JDBC连接的各个方面,旨在为你提供全面的理解和实用技巧。 ### 1. JDBC基础知识 - **JDBC API**: 包含一系列的接口和类,如`java.sql.DriverManager`, `java.sql.Connection`, `java.sql....
- **版本兼容性**:确保JDBC驱动与你的Hive或Impala版本兼容,否则可能会出现连接问题。 总的来说,通过JDBC,开发人员能够方便地在Java应用中集成Hive和Impala,实现对大数据的高效查询和处理。正确配置JDBC驱动...
JDBC 连接数据库方法...JDBC 连接数据库的方法可以分为四个步骤:加载 JDBC 驱动程序、提供 JDBC 连接的 URL、创建数据库的连接、创建一个 Statement。通过这四个步骤,开发者可以轻松地连接数据库并执行 SQL 语句。
以上就是关于JDBC数据库连接测试的核心知识,通过学习这些内容,你可以创建一个简单的JDBC程序,实现对数据库的CRUD操作。在实际项目中,应结合连接池和异常处理机制,确保代码的健壮性和效率。
本篇文章将深入探讨如何使用JDBC连接MySQL驱动,这对于JSP(JavaServer Pages)的初学者来说是非常重要的知识。 首先,我们需要了解JDBC的基本概念。JDBC驱动是Java程序连接到特定数据库的桥梁,对于MySQL,我们...
Oracle客户端JDBC连接测试工具是一种实用程序,它允许开发者和系统管理员通过Java Database Connectivity (JDBC)接口测试与Oracle数据库的连接。这个工具通常包含在Oracle客户端安装中,或者可以作为一个独立的JAR...
JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试JDBC连接数据库测试...
"自定义高并发jdbc连接池"是一个专为处理大量并发请求而设计的解决方案,它允许应用程序高效地管理和复用数据库连接,从而减少数据库连接创建与释放的开销,提高系统的整体性能。 JDBC(Java Database Connectivity...
Tongweb5是一款基于Java的Web应用服务器,它支持配置JDBC连接池来管理数据库连接。本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些...
综上所述,解决JDBC连接Oracle远程数据库时的中文乱码问题,需要从多个层面进行检查和配置,包括应用程序的配置文件、JDBC连接参数、数据库服务器设置以及开发环境等。通过细心排查和合理配置,可以有效地避免这类...
它是MySQL官方提供的一个开源、免费的Java Database Connectivity (JDBC) 驱动,使得Java开发者能够通过编写Java代码来操作MySQL数据库。在描述中提到的"5-8版本的连接器"涵盖了从MySQL 5.0到8.0的主要版本,这些...
标题中的“jdbc连接不同数据库方法”指的是使用Java Database Connectivity (JDBC) API来与不同的数据库进行交互的方法。JDBC是Java平台中用于访问数据库的标准Java API,它允许开发者执行SQL语句并处理结果。 在...
MHT文件是一种单个文件存储网页的格式,可能包含了如何使用JDBC连接数据库的网页教程,包括HTML代码示例和步骤解释。 5. **常用数据库JDBC连接写法.txt** 这个文本文件很可能包含了常用的JDBC连接代码片段,例如...
Java通过JDBC连接Impala是将Java应用程序与大数据分析平台Impala进行交互的一种常见方法。在Java编程中,JDBC(Java Database Connectivity)是用于访问数据库的标准API,它允许Java程序与各种数据库进行通信,包括...
- **驱动管理器(DriverManager)**:它是 JDBC 的一部分,负责加载数据库驱动并创建与数据库的连接。 - **连接(Connection)**:表示应用程序与数据库之间的连接。通过 Connection 对象,应用程序可以与数据库进行...
### JDBC连接数据库步骤详解 #### 一、简介 在Java开发中,经常需要与数据库进行交互,例如查询数据、更新数据等操作。为了方便开发者进行这些操作,Sun公司推出了一套标准的Java访问数据库的API——Java Database...
但是,使用这种模式进行 Web 应用程序开发,存在很多问题:首先,每一次 Web 请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。这个时间对于一次...
JDBC(Java Database Connectivity)是Java语言中用于连接和操作数据库的应用程序接口。它定义了Java应用程序如何与数据库之间通信,允许用户执行SQL语句并获取结果。对于初学者来说,理解JDBC连接数据库的基本步骤...
本篇我们将深入探讨如何使用JDBC连接到Hive,以及在实际操作中可能遇到的关键知识点。 首先,理解JDBC的基本概念是非常必要的。JDBC提供了一组Java接口和类,这些接口定义了与数据库通信的方法。通过实现这些接口,...