因为过去一直在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.
分享到:
相关推荐
首先,我们需要理解为什么从`Access_JDBC30.jar`升级到`Access_JDBC40.jar`会解决问题。`Access_JDBC30.jar`是JDBC 3.0规范的一部分,可能不包含处理某些特定错误或新功能的更新。当使用`Access_JDBC30.jar`时,即使...
在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的标准接口。本文将详细介绍如何使用JDBC连接Microsoft Access数据库,一种常见的轻量级数据库管理系统。Access数据库以其易于使用和...
JDBC常见问题 1. SQLException:JDBC中的异常处理,SQLException是JDBC中的基本异常类,用于处理数据库操作中的异常。 2. 数据类型转换:JDBC提供了多种数据类型转换的方法,例如getInt()、getString()等。 3. ...
在Java编程中,JDBC(Java Database Connectivity)是用于连接Java应用程序和数据库的标准接口。...以上就是关于“JDBC用户名与密码输入问题”相关的知识,以及在实际编程中如何安全地处理这些信息的一些要点。
Java JDBC AutoClose是一个高效、优化过的工具类,用于简化数据库操作,特别是在处理资源关闭方面,比传统的JDBC方法更胜一筹。在传统的JDBC编程中,开发者需要手动关闭数据库连接、Statement对象以及ResultSet对象...
SQL Server 2000 JDBC 是Java编程语言与Microsoft SQL Server 2000数据库进行交互的...以上就是关于"sql server2000 jdbc"的相关知识点,这些内容将帮助Java开发者成功地在应用程序中与SQL Server 2000数据库进行交互。
SQLite JDBC 是一个开源的 Java 驱动程序,允许 Java 应用程序通过 JDBC API 连接到 SQLite 数据库。SQLite 是一个轻量级、自包含的数据库引擎,无需单独的服务器进程,非常适合嵌入式应用或者对小型项目的数据存储...
这篇博客"JAVA的JDBC学习遇到的问题1"可能是作者在深入学习JDBC时遇到的一些常见挑战和解决方法的记录。虽然没有具体的描述内容,我们可以根据一般的学习路径来探讨JDBC相关的知识点。 1. **JDBC基本概念**:首先,...
6. 关闭资源:`rs.close()`, `stmt.close()`, `conn.close()` 记住,使用完数据库连接后及时关闭资源,以避免资源泄露。此外,现代Java应用倾向于使用连接池,如HikariCP或C3P0,它们可以更高效地管理数据库连接。
在IT行业中,Java JDBC(Java Database Connectivity)是一个关键的组件,它允许Java应用程序与各种数据库进行交互。本文将深入探讨如何使用JDBC连接MySQL数据库以及在集成开发环境(IDE)中配置数据库连接。 首先...
**Java数据库连接(JDBC)教程** JDBC(Java Database Connectivity)是Java平台中的一个标准API,用于在Java应用程序和各种类型的数据库之间建立连接。它允许开发者执行SQL语句,处理结果集,以及进行事务管理。...
以上就是关于JDBC数据库连接测试的核心知识,通过学习这些内容,你可以创建一个简单的JDBC程序,实现对数据库的CRUD操作。在实际项目中,应结合连接池和异常处理机制,确保代码的健壮性和效率。
KingbaseV8 JDBC驱动是连接Kingbase数据库管理系统与Java应用程序之间的桥梁,允许Java开发者通过标准的Java Database Connectivity (JDBC) API来访问和操作KingbaseV8数据库。JDBC是Oracle公司提出的用于在Java程序...
通过Connection对象的`getMetaData()`方法可以获得关于数据库的信息,如表结构、列信息等,这对于数据库迁移或自动化工具非常有用。 ### 8. 避免SQL注入 PreparedStatement的参数化特性可有效防止SQL注入攻击,...
在本压缩包"impala数据库JDBC驱动集"中,我们很显然会找到用于连接和操作Impala数据库的JDBC驱动程序。 Impala的主要特点包括其并行查询执行模型,它能够快速地处理PB级别的数据,而无需将数据从HDFS或HBase中提取...
- 关闭资源:操作完成后,确保关闭所有打开的资源,如`rs.close()`, `stmt.close()`, 和`conn.close()`,以释放数据库连接和内存。 3. **测试JDBC连接类(test_jdbc.java)** `test_jdbc.java`可能包含一个名为`...
- `close()`:立即释放连接对象的数据库和JDBC资源。 ##### 3. Statement `Statement`接口用于在已建立的连接基础上向数据库发送SQL语句。它提供了一系列执行SQL语句和获取结果的方法。`Statement`接口包括以下几...
”表明这是一个关于使用JDBC(Java Database Connectivity)驱动程序与Microsoft Access数据库交互的教程或库,且强调了可以进行无限制的读写操作。JDBC是Java平台中用于与各种数据库建立连接的标准接口,它允许Java...
Hive JDBC(Java Database Connectivity)是Hive提供的一种接口,使得其他编程语言,如Java,能够通过JDBC驱动程序与Hive进行交互,实现数据查询、分析和操作。本教程将深入讲解如何使用Hive JDBC在Java项目中建立与...
JDBC(Java Database Connectivity)是Java平台中用于访问数据库的标准API,它允许Java程序与各种类型的数据库进行交互。在本主题中,我们将深入探讨SQL、MySQL以及MySQL JDBC连接包的相关知识。 首先,SQL2005指的...