java开发中如何在ResultSet结果集关闭后,还能使用数据库数据。
2016-10-30 18:41
573 查看
众所周知,在java开发中,涉及到数据库操作时,总会需要一系列的连接数据库的操作类的实例化和使用,如Connection类,PreparedStatement类/Statement类还有ResultSet类。但是,每每使用时,我们总需要在try/catch语句中,finally块中关闭所有资源。否则,如若不关,则会轻易耗尽系统CPU资源。
前几天在练习一个小系统时,突然发现。如下代码。//查询表
public ResultSet queryExecute(String sql)
{
try {
ct = this.getConnection();
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
this.close();
}
return rs;
}如若在正常情况下查询完并没有什么问题,但是在使用model2模式开发时,为了分离数据操作层和业务逻辑层。我们有时候需要操作该函数所返回的ResultSet返回值时就大问题了,如若直接使用“rs”,则会抛出异常:
java.sql.SQLException: Operation not allowed after ResultSet closed(结果集已关闭,无法操作。)
这个时候,内心就郁闷了,如若不关闭资源那又会耗CPU,关闭了则无法操作结果集。感觉碰到一个矛盾体了。几番整治中,才发现了CachedRowSetImpl这个类。
于是,上述代码则改为://查询表
public CachedRowSetImpl queryExecute(String sql)
{
try {
ct = this.getConnection();
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
//填充离线结果集
rowSet = new CachedRowSetImpl();
rowSet.populate(rs);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
this.close();
}
return rowSet;
}将ResultSet类的实例传给CachedRowSetImpl类的实例,然后返回CachedRowSetImpl的实例。接受该返回值的变量直接可以为ResultSet类的实例,毫无影响。Good job!
前几天在练习一个小系统时,突然发现。如下代码。//查询表
public ResultSet queryExecute(String sql)
{
try {
ct = this.getConnection();
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
this.close();
}
return rs;
}如若在正常情况下查询完并没有什么问题,但是在使用model2模式开发时,为了分离数据操作层和业务逻辑层。我们有时候需要操作该函数所返回的ResultSet返回值时就大问题了,如若直接使用“rs”,则会抛出异常:
java.sql.SQLException: Operation not allowed after ResultSet closed(结果集已关闭,无法操作。)
这个时候,内心就郁闷了,如若不关闭资源那又会耗CPU,关闭了则无法操作结果集。感觉碰到一个矛盾体了。几番整治中,才发现了CachedRowSetImpl这个类。
于是,上述代码则改为://查询表
public CachedRowSetImpl queryExecute(String sql)
{
try {
ct = this.getConnection();
ps = ct.prepareStatement(sql);
rs = ps.executeQuery();
//填充离线结果集
rowSet = new CachedRowSetImpl();
rowSet.populate(rs);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
this.close();
}
return rowSet;
}将ResultSet类的实例传给CachedRowSetImpl类的实例,然后返回CachedRowSetImpl的实例。接受该返回值的变量直接可以为ResultSet类的实例,毫无影响。Good job!
相关文章推荐
- web开发 java如何连接数据库并取得数据,实现 增,删,改,查
- 非使用hibernate配置实体类关联数据库表,简单javaBean开发时读取一条数据解决方案
- Java - 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
- 使用java中的关键字(如: delete)用作数据库表中的字段名时,如何取数据
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
- java中删除数据库中重复数据的几个方法-Java基础-Java-编程开发
- 使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space
- 使用Java 的jxl 批量导入数据到数据库
- 如何正确使用Java I/O输出和读入数据
- java 开发小记:如何使用 MyEclipse 开发自己的类库(mylib.jar)以及引用(使用)她
- Visual C# 2008+SQL Server 2005 数据库与网络开发-- 7.3 使用ADO .NET处理数据
- 创建Accress 数据库连接文件UDL/如何使用 ADO 的数据链接文件
- 如何正确使用Java I/O输出和读入数据
- 如何正确使用Java I/O输出和读入数据
- 如何使用 PDI 和 Oracle CDC 来实现Oracle 数据库向其他数据库的数据同步
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格?[转]
- Tom White 是 Kizoom 的首席 Java 开发人员 实现的 如何实现每天定时对数据库的操作
- Visual C# 2008+SQL Server 2005 数据库与网络开发--第8章 使用数据绑定和DataSet
- 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。
- 使用JAVA语言中的addBatch和executeBatch()实现数据批处理插入数据库