java开发中如何在ResultSet结果集关闭后,还能使用数据库数据。

  众所周知,在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!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值