title: jdbc ResultSet closed
body: <p>I have following source.</p>
  
  <p>In insertMessage(..), it calls selectMessage to check whether duplicate record exists or not.</p>
  
  <p>But this error occurs.
  In my brain, it works fine because datasource gives me new Connection...maybe</p>
  
  <pre><code>java.sql.SQLException: ResultSet closed
      at org.sqlite.RS.checkOpen(RS.java:63)
      at org.sqlite.RS.findColumn(RS.java:108)
      at org.sqlite.RS.getString(RS.java:317)
      at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
      at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
      at org.springframework.context.support.CachedMessageSourceDao.selectMessage(CachedMessageSourceDao.java:68)
      at org.springframework.context.support.CachedMessageSourceDao.insertMessage(CachedMessageSourceDao.java:94)
      at MessageSourceDemo.main(MessageSourceDemo.java:11)
  </code></pre>
  
  <hr>
  
  <pre><code>public String selectMessage(String code, String language) {
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      String value = null;
  
      String sql = "SELECT code, value, language FROM " + TABLE + " where code=? and language=? and flag = '" + FLAG_OK + "'";
  
      try {
          conn = dataSource.getConnection();
          conn.setAutoCommit(true);
          pstmt = conn.prepareStatement(sql);
          pstmt.setString(1, code);
          pstmt.setString(2, language);
          rs = pstmt.executeQuery();
          rs.next();
  
          String _code = rs.getString("code");
          String _value = rs.getString("value");
          String _language = rs.getString("language");
          Locale _locale = new Locale(_language);
          value = _value;
  
      } catch(SQLException ex) {
  
          ex.printStackTrace();
  
      } finally {
  
          try {
              if(rs != null);
              if(pstmt != null) pstmt.close();
              if(conn != null) conn.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
  
      }
      return value;
  }
  
  public synchronized void insertMessage(String code, String value, String language) throws SQLException {
      //Duplicate Message Check
      **if(selectMessage(code, language) != null) throw new SQLException("Duplicate message exists for code: " + code + " and" + "language: " + language);**
  
      String sql = "INSERT INTO " + TABLE + " (code, value, language, flag) values (?, ?, ?, '" + FLAG_OK + "')";
  
      Connection conn = null;
      PreparedStatement pstmt = null;
  
      try {
          conn = dataSource.getConnection();
          conn.setAutoCommit(true);
          pstmt = conn.prepareStatement(sql);
          pstmt.setString(1, code);
          pstmt.setString(2, value);
          pstmt.setString(3, language);
          pstmt.execute();
  
      } catch(SQLException ex) {
  
          ex.printStackTrace();
  
      } finally {
  
          try {
  
              if(pstmt != null) pstmt.close();
              if(conn != null) conn.close();
  
          } catch (SQLException e) {
  
              e.printStackTrace();
  
          }
  
      }
  
      notifyMessageChange(); //Realtime apply to MessageSource
  }
  </code></pre>