在制作BBS论坛的过程中,根据需要,我计划将数据库的访问、查询操作和查询结果分在两个函数中进行,即在数据库操作类DBAccess中有两个函数(错误代码):
private ResultSet executeQuery(String sql) throws SQLException {
conn=ds.getConnection();
conn.setAutoCommit(false);
stat=conn.createStatement(scrollType, concurType);
rs=stat.executeQuery(sql);
conn.commit();
return rs;
}finally {
if(stat!=null) {
stat.close();
if (conn != null) {
conn.close();
public String useRes(String...params) throws SQLException {...}
前者负责查询,后者负责使用查询结果。
我在executeQuery()中使用finally块释放了数据库连接。我认为这里查询结果rs未被释放,所以我可以在useRes()中调用executeQuery()得到我想要的结果集,结果却出现了SQLException: Closed Resultset错误。经过研究,实际上当stat被关闭的时候,它所产生的rs也已经失效了,因此才会出现该错误。
解决方法很显然,要在使用完结果集后再关闭连接。即在useRes()中再使用finally释放数据库资源。当然,另一种做法是将结果集转化为List后再返回给调用函数使用,此方法我没有使用,这里就不解释了。
在制作BBS论坛的过程中,根据需要,我计划将数据库的访问、查询操作和查询结果分在两个函数中进行,即在数据库操作类DBAccess中有两个函数(错误代码):private ResultSet executeQuery(String sql) throws SQLException { try{ conn=ds.getConnection(); conn.setAutoCo
Operation not allowed after ResultSet closed,ResultSet is from UPDATE. No Data和Column ‘xxx’ not found报错的解决方法
1. Operation not allowed after ResultSet closed的解决方法
报错原因:
Operation not allowed after Resu...
异常:Operation not allowed after ResultSet closed
这个异常感觉很莫名其妙,明明就在方法调用完就close啦,方法开始就开启ResultSet啦。为什么会报这个异常呢?
这个是怎么一回事呢,我先说一下,其实就是异步引起的,当你的项目有多个请求到同一个方法里面,可能就会遇到这里问题,而我是在反射的时候多个请求调用了这个反射而我的ResultS...
在执行executeQuery之后,然后
关闭连接池,此时
ResultSet也会
关闭(可能跟垃圾回收有关吧)
之前是用一个统一的方法执行select 语句
public static
ResultSet exeQuerySql(String strSql) throws
SQLException
Connection conn=null;
java.sql.SQLException:ResultSet is closed
at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6646)
at sun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(JdbcOdbcResultSet.java:1765)
一个stmt多个rs进行操作引起的ResultSet已经关闭错误
一个stmt多个rs进行操作.
那么从stmt得到的rs1,必须马上操作此rs1后,才能去得到另外的rs2,再对rs2操作.
不能互相交替使用,会引起rs已经关闭错误.
错误的代码如下:
stmt=conn.createStatemen
ResultSetMetaData md = (
ResultSetMetaData)rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String,Object>map = new HashMap<String...
if 条件内,如果 rs.findColumn(columnName) > 0 ,ResultSet结果集中的列索引从1开始,不同于数组和list的从0开始,所以如果找到某列,那么它的索引值必然大于0;如果没有找到呢,那么就会有SQLException 异常抛出来,我们这里将这个SQLException 异常利用起来,如果进入异常块,则说明没有找到该列,那么直接返回false就可以了。
这样在mapRow 中,如果多个属性的时候,每次可以判断下,该ResultSet 中是否查询出来该列,查询出来了就做映射,
java.sql.SQLException: 结果集已耗尽是一个JDBC异常,表示已经遍历完了结果集中的所有数据。
当使用JDBC从数据库中查询数据时,查询结果会以结果集的形式返回给应用程序。结果集是一个类似表格的结构,包含了一系列的记录和字段。
当我们向结果集中读取数据时,使用next()方法将指针移动到下一行,并返回一个布尔值,表示下一行是否存在。如果存在,我们可以获取该行的数据。如果不存在,即遍历完了整个结果集,将抛出java.sql.SQLException: 结果集已耗尽异常。
这个异常通常出现在以下情况下:
1. 当使用ResultSet对象从数据库中读取数据时,读取到最后一行,然后再次调用next()方法。
2. 当在一个ResultSet对象读取数据时,将ResultSet对象传递给其他方法或者其他线程,而这个ResultSet对象已经遍历完了所有数据。
3. 当使用同一个Statement对象执行多个查询语句时,如果没有使用close()方法显式关闭ResultSet对象,那么当执行下一个查询时,结果集已经被耗尽。
为了避免java.sql.SQLException: 结果集已耗尽异常,我们可以在使用ResultSet对象之后,及时关闭ResultSet、Statement和Connection对象,以释放资源。同时,在使用ResultSet对象之前,也可以先调用next()方法检查是否存在下一行数据,避免无法读取数据时抛出异常。
总之,java.sql.SQLException: 结果集已耗尽异常表示已经读取完了结果集中的数据,可通过关闭ResultSet、Statement和Connection对象以及在使用ResultSet之前检查是否存在下一行数据来避免该异常的发生。
### 回答2:
java.sql.SQLException: 结果集已耗尽是指在使用 JDBC 进行数据库查询时,结果集已经被遍历完毕,没有更多的数据可供访问。
当使用 ResultSet 对象获取数据库查询的结果集时,通常会使用 next() 方法来判断是否还有更多的数据行可供读取。如果 next() 方法返回 false,即表示结果集已经到达末尾。
出现 ResultSet exhausted 的原因可能有以下几种情况:
1. 结果集已经被完全遍历:通过在循环中使用 next() 方法遍历结果集时,如果没有在循环中提前退出或跳出循环,可能导致结果集被完全遍历。
示例代码如下:
```java
ResultSet rs = statement.executeQuery("SELECT * FROM table_name");
while (rs.next()) {
// 遍历结果集的每一行数据
// ...
// 循环结束后,结果集已经耗尽
2. 结果集使用完毕后未关闭:使用完 ResultSet 对象后,应该及时调用 close() 方法关闭结果集,以释放相关资源。
示例代码如下:
```java
ResultSet rs = statement.executeQuery("SELECT * FROM table_name");
// 处理结果集数据
// ...
rs.close(); // 关闭结果集
3. 结果集在查询语句执行后未立即访问:某些情况下,当查询语句执行后,如果不立即访问结果集,而是先执行其他操作,可能导致结果集耗尽。
示例代码如下:
```java
ResultSet rs = statement.executeQuery("SELECT * FROM table_name");
// 其他业务逻辑处理
// ...
while (rs.next()) {
// 访问结果集数据
// ...
为避免出现结果集已耗尽的异常,应该在使用 ResultSet 对象时及时关闭结果集,并在执行查询后立即访问结果集。另外,也可以通过判断结果集的元数据(例如列数、列类型等)来确定是否有数据可供读取。
### 回答3:
java.sql.SQLException: 结果集已耗尽,是指在使用Java程序连接数据库,并且执行SQL查询语句后,尝试获取结果集中的下一行数据时,但是结果集已经没有更多的数据可供获取,此时程序会抛出此异常。
这种情况通常发生在以下几种情况下:
1. 在使用游标(ResultSet)遍历结果集时,已经遍历到结果集的最后一行,再次调用next()方法获取下一行数据时,就会出现该异常。
2. 在使用游标(ResultSet)遍历结果集时,再次调用next()方法获取下一行数据时,结果集已经被其他操作关闭了,导致结果集不可访问,此时也会抛出该异常。
3. 在使用游标(ResultSet)遍历结果集时,结果集的大小与代码逻辑不符合,比如结果集本应该有5行数据,但是已经提前遍历到了第6行,再次获取数据时就会出现该异常。
要解决这个问题,可以采取以下措施:
1. 在使用游标遍历结果集时,使用if语句判断是否还有下一行数据,避免出现结果集已耗尽的情况。如:
while(resultSet.next()){
// 获取数据
2. 在多线程环境下,对于可能会关闭结果集的操作,需要进行合适的同步处理,避免在其他线程中关闭结果集时,当前线程还在尝试获取数据。
3. 检查代码逻辑,确保结果集的大小与代码中对结果集的操作一致,避免出现不一致的情况。
总结:当出现java.sql.SQLException: 结果集已耗尽的异常时,说明在操作结果集时,结果集已经没有更多的数据可供获取了。解决该问题可以通过合理的代码逻辑和对结果集的判断,避免出现该异常。