java - jdbc 结果集关闭

标签 java jdbc

我有以下来源。

在insertMessage(..)中调用selectMessage判断是否存在重复记录。

但是出现了这个错误。 在我的大脑中,它工作正常,因为数据源给了我新的连接......也许

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)

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
}

最佳答案

你的 resultset 可能没有任何记录,这就是 next() 关闭它的原因。

next()返回一个 boolean 值,检查它。

关于java - jdbc 结果集关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977064/

相关文章:

java - 按下按钮时如何从另一个框架刷新 JTable?

mysql - 如何使用jsp从excel(apache poi)中提取数据并将其放入mysql表中?

java - 如何编写 JAVA CLASS 和 PHP API 来发布和读取现有 MySQL 数据库

Java:如何按属性对列表元素进行分组

java - Freemarker 与 spring mvc,那么我的操作会是什么样子?

Java else 语句错误

java - 使用 Eclipse 和 CHD4 的 JDBC 连接到 Hive 时出错

java - 在jcalendar中以不同颜色显示mysql数据库中的日期

java - sqlitejdbc在哪里下载?

通过 JNI 从 native 线程回调时 Java 线程泄漏