I was stuck with the error , here my line number 42 is while(rs.next()){
, please help me with this i am stuck at this for few hrs.
> 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)
This is my code:
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(); } }
Advertisement
Answer
A Statement
object can have only one active ResultSet
, so when you execute rs2 = stmt.executeQuery(sql)
, the first ResultSet (rs
) gets closed.
Create two Statement
objects, one for rs
and another for rs2
.
Quoting the javadoc of Statement
:
By default, only one
ResultSet
object perStatement
object can be open at the same time. Therefore, if the reading of oneResultSet
object is interleaved with the reading of another, each must have been generated by differentStatement
objects. All execution methods in theStatement
interface implicitly close a statment’s currentResultSet
object if an open one exists.