文档章节

关于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
海淀
程序员
but failed to unregister it when the web .....

在Intellij IDEA中运行web项目,抛出了一大顿异常。仔细看了下控制台,发现如下关键信息: org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc The web application [*(项目...

Java编程思想
2014/02/14
0
0
Spring的事务管理难点剖析(5):联合军种作战的混乱

Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋。像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不 太方便;而iBatis则通过模板化技术让你方便地控制SQL,但没有...

icheer
2012/07/17
0
0
异常: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
【转】15个顶级Java多线程面试题及回答

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

一只死笨死笨的猪
2014/09/30
0
0
15个顶级Java多线程面试题及回答

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

LCZ777
2014/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
昨天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
昨天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
昨天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
昨天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部