Операция не разрешена после закрытия ResultSet (mysql, java)

Я застрял в ошибке, здесь моя строка номер 42 находится в while(rs.next()){ , пожалуйста, помогите мне с этим, я застрял в этом несколько часов.

 > Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872) at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:740) at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6326) at removeStopwords.RemoveStopwords.main(RemoveStopwords.java:42) 

Это мой код:

 package removeStopwords; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.StringTokenizer; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; public class RemoveStopwords { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/mydbv2"; // Database credentials static final String USER = "root"; static final String PASS = "***"; public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection conn = null; Statement stmt = null; Class.forName("com.mysql.jdbc.Driver"); conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS); stmt = (Statement) conn.createStatement(); String sql; ResultSet rs = null; ResultSet rs2 = null; ResultSet rs3 = null; java.sql.PreparedStatement ps = null; int event_id = 10; sql = "SELECT id,text from tweet where event_id = " + event_id; rs = stmt.executeQuery(sql); String text = ""; Long id; while (rs.next()) { id = rs.getLong("id"); text = rs.getString("text"); System.out.println("tweet = " + text); text = text.replaceAll("http[^\\s]+", ""); text = text.replaceAll("www[^\\s]+", ""); System.out.println("tweet after removal of links= " + text); StringTokenizer st = new StringTokenizer(text); while (st.hasMoreTokens()) { String stopword = st.nextToken(); System.out.println("stopword : " + stopword); sql = "SELECT * from stopwords WHERE word =" + '"'+stopword+'"'; rs2 = stmt.executeQuery(sql); if (rs2.next()) { text = text.replaceAll(stopword, ""); System.out.println("tweet after removing stopword = " + text); } sql = "SELECT * from filtertweet where tweet_id = " + id + ""; rs3 = stmt.executeQuery(sql); if (!rs3.next()) { sql = "INSERT INTO filtertweet VALUES(?,?)"; ps = conn.prepareStatement(sql); ps.setLong(1, id); ps.setString(2, text); ps.executeUpdate(); } } } stmt.close(); conn.close(); } } 

Объект Statement может иметь только один активный ResultSet , поэтому при выполнении rs2 = stmt.executeQuery(sql) первый ResultSet ( rs ) закрывается.

Создайте два объекта Statement , один для rs и другой для rs2 .

Цитирование javadoc Statement :

По умолчанию одновременно может быть открыт только один объект ResultSet объекта Statement . Поэтому, если чтение одного ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement . Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet если существует открытый.

Один ResultSet для одного заявления действителен. Когда вы выполняете несколько запросов, используйте различные выражения.

 public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection conn = null; Statement stmt = null; Class.forName("com.mysql.jdbc.Driver"); conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS); stmt = (Statement) conn.createStatement(); String sql; ResultSet rs = null; ResultSet rs2 = null; ResultSet rs3 = null; java.sql.PreparedStatement ps = null; int event_id = 10; sql = "SELECT id,text from tweet where event_id = " + event_id; rs = stmt.executeQuery(sql); String text = ""; Long id; while (rs.next()) { id = rs.getLong("id"); text = rs.getString("text"); System.out.println("tweet = " + text); text = text.replaceAll("http[^\\s]+", ""); text = text.replaceAll("www[^\\s]+", ""); System.out.println("tweet after removal of links= " + text); StringTokenizer st = new StringTokenizer(text); while (st.hasMoreTokens()) { String stopword = st.nextToken(); System.out.println("stopword : " + stopword); sql = "SELECT * from stopwords WHERE word =" + '"'+stopword+'"'; Statement stmt2 = conn.createStatement(); rs2 = stmt2.executeQuery(sql); if (rs2.next()) { text = text.replaceAll(stopword, ""); System.out.println("tweet after removing stopword = " + text); } sql = "SELECT * from filtertweet where tweet_id = " + id + ""; Statement stmt3 = conn.createStatement(); rs3 = stmt3.executeQuery(sql); if (!rs3.next()) { sql = "INSERT INTO filtertweet VALUES(?,?)"; ps = conn.prepareStatement(sql); ps.setLong(1, id); ps.setString(2, text); ps.executeUpdate(); } } } stmt.close(); conn.close(); }