数据库关闭异常

weidu23 2013-09-02 10:43:21
请先看我的代码:

public Vector select(Object pojo,String condition , String conditionValue){
Vector v = new Vector();
GetConnection getConn = null ;
SQLFactory sf = new SQLFactory(pojo);
String sql = sf.createSql(
SQLFactory.SELECT,condition,conditionValue);
try{
getConn = new GetConnection();
conn = getConn.getConnection() ;
stat = conn.createStatement();
rs = stat.executeQuery(sql);
while(rs.next()){
Vector tempV = new Vector();
tempV.add(rs.getInt(1));
tempV.add(rs.getString(2));
tempV.add(rs.getString(3));
tempV.add(rs.getString(4));
v.add(tempV);
}
}
catch(Exception err){
err.printStackTrace();
}
finally{
try {
System.out.println(rs);
if( null != rs
&& !rs.isClosed() )
rs.close();
rs = null ;
if( null != stat && !stat.isClosed())
stat.close();
stat = null ;
} catch (SQLException e) {
e.printStackTrace();
}
getConn.close();
conn = null ;
}
return v ;
}

这个代码,报错如下:
oracle.jdbc.driver.OracleResultSetImpl@1dfc547
Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.isClosed()Z
at dao.BasicDBOImpl.select(BasicDBOImpl.java:124)
at util.CheckData.isExist(CheckData.java:12)
at dao.BasicDBOImpl.add(BasicDBOImpl.java:26)
at dao.BasicDBOImpl.main(BasicDBOImpl.java:140)

从报错情况看,输出:oracle.jdbc.driver.OracleResultSetImpl@1dfc547,
说明rs不为null,
与此同时,at dao.BasicDBOImpl.select(BasicDBOImpl.java:124),
说明问题出在第125&& !rs.isClosed()这里!

-------------------------

问题1,既然rs没问题,怎么会有错 ?

问题2:怎么改 ?


菜鸟求教
...全文
274 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
weidu23 2013-09-06
  • 打赏
  • 举报
回复
引用 14 楼 jsjhxqh 的回复:
貌似没问题啊,把jar包换了
问题找到了,是Oracle自带的驱动有问题 !!!
weidu23 2013-09-06
  • 打赏
  • 举报
回复
引用 14 楼 jsjhxqh 的回复:
貌似没问题啊,把jar包换了
与jar关系不大把 ! 用的是oracle 10g里面jdbc自带class12.jar !
weidu23 2013-09-05
  • 打赏
  • 举报
回复
引用 9 楼 victor_hr 的回复:
编译不报错?如楼上的所说的,rs在try外面都没定义啊。
我的程序里面,是数据库连接是类变量这一级别!定义时显式定义为null 然后,在函数里面,创建相应的连接! 同样,在函数里创建,并在函数里释放!
weidu23 2013-09-05
  • 打赏
  • 举报
回复
引用 8 楼 csdt_csdt 的回复:
我也遇到过类似的问题,我是这样解决的。 在上面提前定义 :ResultSet rs = null;
我的ResultSet是类变量,不是函数局部变量! 我的Connection \ Statement \ ResultSet是类变量, 方式如下: conn = null ; stat = null ; rs = null ; 然后,在再函数内部创建相应空间,用完释放!
weidu23 2013-09-05
  • 打赏
  • 举报
回复
引用 7 楼 fudongrifdr 的回复:
好像不是开源的,还是找个官方文档看看吧,具体什么原因不好乱猜
好吧!
harrisonkao 2013-09-05
  • 打赏
  • 举报
回复
貌似没问题啊,把jar包换了
踩踩一哥 2013-09-05
  • 打赏
  • 举报
回复
引用 楼主 weidu23 的回复:
请先看我的代码:

	public Vector select(Object pojo,String condition , String conditionValue){
		Vector v = new Vector();
		GetConnection getConn = null ;
		SQLFactory sf = new SQLFactory(pojo);
		String sql = sf.createSql(
                                     SQLFactory.SELECT,condition,conditionValue);
		try{
			getConn = new GetConnection();
			conn = getConn.getConnection() ;
			stat = conn.createStatement();
			rs = stat.executeQuery(sql);
			while(rs.next()){
				Vector tempV = new Vector();
				tempV.add(rs.getInt(1));
				tempV.add(rs.getString(2));
				tempV.add(rs.getString(3));
				tempV.add(rs.getString(4));
				v.add(tempV);
			}
		}
		catch(Exception err){
			err.printStackTrace();
		}
		finally{
			try {
				System.out.println(rs);
				if( null != rs 
						&& !rs.isClosed() )
					rs.close();
					rs = null ;
				if( null != stat && !stat.isClosed())
					stat.close();
					stat = null ;
			} catch (SQLException e) {
				e.printStackTrace();
			}
			getConn.close();
			conn = null ;
		}
		return v ;
	}
这个代码,报错如下: oracle.jdbc.driver.OracleResultSetImpl@1dfc547 Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.isClosed()Z at dao.BasicDBOImpl.select(BasicDBOImpl.java:124) at util.CheckData.isExist(CheckData.java:12) at dao.BasicDBOImpl.add(BasicDBOImpl.java:26) at dao.BasicDBOImpl.main(BasicDBOImpl.java:140) 从报错情况看,输出:oracle.jdbc.driver.OracleResultSetImpl@1dfc547, 说明rs不为null, 与此同时,at dao.BasicDBOImpl.select(BasicDBOImpl.java:124), 说明问题出在第125&& !rs.isClosed()这里! ------------------------- 问题1,既然rs没问题,怎么会有错 ? 问题2:怎么改 ? 菜鸟求教
你为什么要判断rs.isclosed呢?用完之后直接rs.close就行了。具体可以看jar包源码BasicDBOImpl接口实现
蟹道人 2013-09-04
  • 打赏
  • 举报
回复
我也遇到过类似的问题,我是这样解决的。 在上面提前定义 :ResultSet rs = null;
末日哥 2013-09-04
  • 打赏
  • 举报
回复
好像不是开源的,还是找个官方文档看看吧,具体什么原因不好乱猜
weidu23 2013-09-04
  • 打赏
  • 举报
回复
引用 5 楼 fudongrifdr 的回复:
有兴趣的话可以去看看源码
抽象方法怎么看源码,都不知道哪里实现了! 我还真的小白了, 大神带个路,指点下 ...
末日哥 2013-09-04
  • 打赏
  • 举报
回复
有兴趣的话可以去看看源码
末日哥 2013-09-04
  • 打赏
  • 举报
回复
估计是oracle.jdbc.driver.OracleResultSetImpl没有给出isClosed()的实现,所以导致调用了抽象方法出错
weidu23 2013-09-04
  • 打赏
  • 举报
回复
引用 2 楼 fudongrifdr 的回复:
换个其他版本的驱动试试
都一样,是这样的,这里,问题出在第27行和28行:

                if( null != rs 
                        && !rs.isClosed() )
如果把 !rs.isCloed()去掉,程序就正常了。很纠结! 【把"&&"改成" || "是不行的】
奕轻辰 2013-09-04
  • 打赏
  • 举报
回复
编译不报错?如楼上的所说的,rs在try外面都没定义啊。
末日哥 2013-09-03
  • 打赏
  • 举报
回复
换个其他版本的驱动试试
weidu23 2013-09-03
  • 打赏
  • 举报
回复
我想,这本该是张不沉贴的 ... SOS ... 求救 ...

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧