文档章节

关于JDBC的close问题

猪刚烈
 猪刚烈
发布于 2014/10/12 11:48
字数 590
阅读 10
收藏 0

     因为过去一直在Hibernate上开发程序,对于JDBC的直接应用相对较少。最近在编写一个从1000万的表中提取数据为全文检索做索引的程序时出现了内存益处(OutOfMemoryError)问题,经过反复排查发现问题的根源在于没有及时地close数据库的相关资源。在我的程序中,一批一批地从数据库中提取数据进行索引。一开始,为了减少不必要的开销,我只建立了一个Connection,每次将数据加载到内存时都使用这一个Connection.尽管我注意到了在每个批次执行结束后,把不必要的对象引用置空,但这并没有阻止内存益处的问题。事实上,查询的数据集并不只是由DateSet一个引用来指向的,ResultSet从属于Statement,Statement又从属于Connection,这样,单纯地把ResultSet或Statement置空并不会使它们的数据集合被GC回收。(而对于Connection来说,它被置空成为垃圾时,JVM会调用它的close方法来释放资源,但这不是好的编程习惯,我们还是应该显式地调用close来完成这一工作)。因此,我的程序的问题在于:使用一个Connection并在最后关闭它并不是问题,问题在于,在循环过程中间,没有释放Statement和ResultSet!这里所说的“释放”,是指调用它们的close方法,而不是把它们置空!或者另一个方法就是每次循环打开一个Connection,并在循环结束时关闭它。
     对于ResultSet,Statement,Connection的关闭有这样一种关系:关闭一个Statement会把它的所有的ResultSet关闭掉,关闭一个Connection会把它的所有的Statement关闭掉。以下摘自《Database Programming with JDBC and JAVA》3.3.3一节:
     The Connection, Statement, and ResultSet classes all have close( ). A given JDBC
implementation may or may not require you to close these objects before reuse. But some might
require it, since they are likely to hold precious database resources. It is therefore always a good
idea to close any instance of these objects when you are done with them. It is useful to remember
that closing a Connection implicitly closes all Statement instances associated with the
Connection.[3] Similarly, closing a Statement implicitly closes ResultSet instances associated
with it. If you do manage to close a Connection before committing with auto-commit off, any
uncommitted transactions will be lost.

本文转载自:http://blog.csdn.net/bluishglc/article/details/5796766

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
一个非常诡异的服务器大量CLOSE_WAIT的问题

问题表现是这样的,服务器响应缓慢,netstat发现大量CLOSE_WAIT的连接 如下ssm的框架 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 1 0 127.0.0.1:8071 ...

进入休眠期
2017/01/12
3.5K
8
异常:A web application registered the JBDC driver

2011-9-1 0:15:11 org.apache.catalina.startup.Catalina start 信息: Server startup in 35866 ms 2011-9-1 2:05:43 org.apache.coyote.http11.Http11Protocol pause 信息: Pausing Coyote ......

陶邦仁
2015/03/25
0
0
共享一篇红薯大哥在2002年在IBM上的“使用 JAVA 中的动态代理实现数据库连接池”

http://www.ibm.com/developerworks/cn/java/l-connpoolproxy/index.html 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术...

山哥
2010/11/15
421
7
关于mvn install命令执行报错问题

首先这个报错,通常要么是依赖问题,比如模块之间的依赖传递问题,通常报这种错误会在控制台提示。 或者是比如子工程分为test-entity、test-dao、test-service、test-web三者之间依赖传递,w...

youcongtech
07/29
0
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
178
4
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
14
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
21
0

中国龙-扬科
昨天
4
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部