(1) 主要问题
针对关闭connection是否会自动关闭Statement和ResultSet的问题,以及Statement和ResultSet所占用资源是否会自动释放问题,JDBC处理规范或JDK规范中做了如下描述:
JDBC处理规范
JDBC. 3.0 Specification——13.1.3 Closing Statement Objects
An applicationcalls the method Statement.close to indicate that it has finished processing astatement. All Statement objects will be closed when the connection thatcreated them is closed. However, it is good coding practice for applications toclose statements as soon as they have finished processing them. This allows anyexternal resources that the statement is using to be released immediately.
Closing aStatement object will close and invalidate any instances of ResultSet producedby that Statement object. The resources held by the ResultSet object may not bereleased until garbage collection runs again, so it is a good practice toexplicitly close ResultSet objects when they are no longer needed.
These commentsabout closing Statement objects apply to PreparedStatement and CallableStatementobjects as well.
JDBC. 4.0 Specification——13.1.4 Closing Statement Objects
An applicationcalls the method Statement.close to indicate that it has finished processing astatement. All Statement objects will be closed when the connection that createdthem is closed. However, it is good coding practice for applications to closestatements as soon as they have finished processing them. This allows any externalresources that the statement is using to be released immediately.
Closing aStatement object will close and invalidate any instances of ResultSet producedby that Statement object. The resources held by the ResultSet object may not bereleased until garbage collection runs again, so it is a good practice to explicitlyclose ResultSet objects when they are no longer needed.
Once aStatement has been closed, any attempt to access any of its methods with theexception of the isClosed or close methods will result in a SQLException beingthrown.
These commentsabout closing Statement objects apply to PreparedStatement andCallableStatement objects as well.
规范说明:connection.close 自动关闭 Statement.close 自动导致 ResultSet 对象无效(注意只是 ResultSet 对象无效,ResultSet 所占用的资源可能还没有释放)。所以还是应该显式执行connection、Statement、ResultSet的close方法。特别是在使用connection pool的时候,connection.close 并不会导致物理连接的关闭,不执行ResultSet的close可能会导致更多的资源泄露。
JDK处理规范:
JDK1.4
Note: A ResultSet object is automatically closed by theStatement object that generated it when that Statement object is closed,re-executed, or is used to retrieve the next result from a sequence of multipleresults. A ResultSet object is also automatically closed when it is garbagecollected.
Note: A Statement object is automatically closed when it isgarbage collected. When a Statement object is closed, its current ResultSetobject, if one exists, is also closed.
Note: A Connection object isautomatically closed when it is garbage collected. Certain fatal errors alsoclose a Connection object.
JDK1.5
Releases this ResultSet object'sdatabase and JDBC resources immediately instead of waiting for this to happenwhen it is automatically closed.
Note: A ResultSet object isautomatically closed by the Statement object that generated it when thatStatement object is closed, re-executed, or is used to retrieve the next resultfrom a sequence of multiple results. A ResultSet object is also automaticallyclosed when it is garbage collected.
规范说明:
1.垃圾回收机制可以自动关闭它们;
2.Statement关闭会导致ResultSet关闭;
3.Connection关闭不一定会导致Statement关闭。
V6使用的是数据库连接池,Connection关闭并不是物理关闭,只是归还连接池,所以Statement和ResultSet有可能被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行就有可能报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
(2) 解决建议
(1) 由于垃圾回收的线程级别是最低的,为了充分利用数据库资源,有必要显式关闭它们,尤其是使用Connection Pool的时候;
(2) 最优经验是按照ResultSet,Statement,Connection的顺序执行close;
(3) 为了避免由于java代码有问题导致内存泄露,需要在rs.close()和stmt.close()后面一定要加上rs = null和stmt = null;
(4) 如果一定要传递ResultSet,应该使用RowSet,RowSet可以不依赖于Connection和Statement。Java传递的是引用,所以如果传递ResultSet,你会不知道Statement和Connection何时关闭,不知道ResultSet何时有效。
分享到:
相关推荐
- **C3P0**:一个开源的JDBC连接池,提供了强大的异常处理和性能监控。 - **DBCP**:Apache提供的数据库连接池,基于Jakarta-pool实现。 - **HikariCP**:目前性能最佳的连接池,设计目标是速度、简单性和零内存...
总结来说,JDBC数据库连接池如Druid的实现主要涉及以下几个步骤:引入依赖、配置连接池属性、在代码中使用连接池以及可选的监控和扩展。通过这些方式,我们可以有效地管理和优化数据库连接,提高应用的运行效率。
在这个改进后的版本中,当离开try块时,所有的AutoCloseable对象(包括Connection、Statement和ResultSet)都会自动关闭,无论是否抛出异常,从而避免了资源泄露的问题。 此外,还可以考虑使用PreparedStatement和...
当应用程序需要与数据库交互时,它不会直接创建新的连接,而是从连接池中获取一个已存在的连接,使用完毕后归还给池而不是关闭连接。这样可以避免频繁地创建和销毁连接,减少了系统开销,提高了资源利用率。 SQL ...
- 关闭资源:在操作完成后,需关闭ResultSet、Statement和Connection,释放数据库资源。 3. **JDBC性能优化** - 使用PreparedStatement:预编译的SQL可以提高执行效率,避免SQL注入攻击。 - 批量处理:通过`...
- 使用完毕后,应该关闭所有的资源,包括`ResultSet`、`Statement`和`Connection`对象。 ```java rs.close(); stmt.close(); conn.close(); ``` #### 三、数据库连接池 数据库连接池是一种管理数据库连接的...
JDBC(Java DataBase Connectivity)是一种用于执行SQL语句的Java应用程序接口,它作为Java应用程序和数据库之间的桥梁。JDBC允许开发者使用标准的Java代码来连接各种关系型数据库管理系统(RDBMS),从而简化了跨...
6. **关闭资源**:在完成数据库操作后,记得关闭ResultSet、Statement和Connection。 ### 3. CRUD操作 JDBC支持对数据库的基本CRUD(Create、Read、Update、Delete)操作: - **创建(Create)**:使用`...
"JDBC&Druid数据库连接池" JDBC(Java Database Connectivity)是一种Java API,用于连接和操作数据库。Druid是一个Java语言的数据库连接池,旨在提供高效、稳定、可靠的数据库连接服务。 JDBC基本概念 JDBC是一...
1. **C3P0**:一个开源的JDBC连接池,它包含一个内置的、完全配置的JNDI绑定的 DataSource 实现。 2. **DBCP (Apache Commons DBCP)**:Apache提供的一个数据库连接池,基于Jakarta Pool组件实现。 3. **HikariCP**...
**数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...
6. **关闭资源**:在操作完成后,确保正确地关闭`ResultSet`、`Statement`和`Connection`,以释放数据库资源。这通常在finally块中完成,以确保即使在发生异常时也能关闭资源。 例如,一个简单的查询示例可能是这样...
在Java中,通过JDBC API与数据库进行交互,通常涉及到`Connection`、`ResultSet`和`Statement`接口。连接池通过提供`DataSource`接口,使得应用程序能够透明地管理和复用数据库连接。`DataSource`是Java SQL API的...
### JDBC技术和数据库连接池专题 #### 一、JDBC基础知识概览 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。...
6. **关闭资源**:在完成数据库操作后,必须关闭`ResultSet`、`Statement`和`Connection`,释放数据库资源。 **数据库连接池(Connection Pool):** 由于频繁的数据库连接创建和释放会导致性能下降和资源浪费,...
数据库连接池会在应用启动时预先创建一定数量的连接,当需要时直接提供,用完后归还而不是关闭,从而减少了数据库连接的创建和关闭次数。 总的来说,JDBC数据库连接工具类是Java开发中的一个重要组件,它封装了...
本文将详细介绍如何使用JDBC连接Oracle、SqlServer、MySql和Access这四种常见的数据库。 一、Oracle数据库连接 Oracle数据库是企业级的大型关系型数据库管理系统。在Java中,我们通常会使用`ojdbc`驱动来连接Oracle...
记得在使用完毕后关闭`ResultSet`、`Statement`和`Connection`,避免资源浪费。 在实际开发中,为了代码的可读性和维护性,通常会采用连接池管理数据库连接,如Apache的DBCP、C3P0或HikariCP。连接池预先创建并维护...