java - JDBC ResultSet 关闭语句

标签 java jdbc resultset

我正在尝试编写一个函数来更新数据库中的 2 个表。我收到一个错误,我认为这是由于在结果集中调用 next() 引起的,而该结果集中没有更多行。 我认为 hasNext() 上的 if 条件可以解决此问题,但它不适用于结果集...

我收到的错误是“语句关闭后不允许执行任何操作。”

private void updateDatabase() throws Exception {
        Connection conn = getConnection();
        PreparedStatement updateMovieStmt = conn.prepareStatement("INSERT INTO movies VALUES(null,?,null,null,null)", Statement.RETURN_GENERATED_KEYS);
        PreparedStatement updateVideoStmt = conn.prepareStatement("INSERT INTO video_files VALUES(null,null,null,?,?)", Statement.RETURN_GENERATED_KEYS);
        try {
            for (Movie localMovie : getLocalMovies()) {
                // fetch a local movie{
                boolean newMovie = true;
                for (Movie dbMovie : getDatabaseMovies(conn)) {
                    newMovie = true;
                    Pattern p = Pattern.compile(localMovie.getTitlePattern(), Pattern.CASE_INSENSITIVE);
                    Matcher m = p.matcher(dbMovie.getTitle());
                    // if it's already in the database not new movie... but is
                    // is it a new video rip????????????;
                    if (m.find()) {
                        System.out.println("DB movie: " + dbMovie.getTitle() + " matches localpattern of: " + localMovie.getTitlePattern());
                        newMovie = false;
                        break;
                    }
                }
                if (newMovie == true && localMovie.getTitle() != null) {
                    updateMovieStmt.setString(1, localMovie.getTitle());
                    updateMovieStmt.executeUpdate();
                    // get new movie id and put into new video row
                    ResultSet rs = updateMovieStmt.getGeneratedKeys();
                    if (rs.next()) {
                        updateVideoStmt.setBytes(1, localMovie.getHash());
                        updateVideoStmt.setInt(2, rs.getInt(1));
                        updateVideoStmt.executeUpdate();
                    }

                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            updateMovieStmt.close();
            updateVideoStmt.close();
            conn.close();
        }
    }

最佳答案

如果您不使用批处理 (addBatch()/executeBatch()),也不清除参数 (clearParameters()) ,那么您应该在循环内部创建语句,而不是在循环外部。

将两行 conn.prepareStatement() 行移至 if (newMovie == true && localMovie.getTitle() != null) block 中,最好单独重构方法。您当前的方法做得太多了。

关于java - JDBC ResultSet 关闭语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6011924/

相关文章:

java - Vaadin 国际化问题 : java. util.MissingResourceException

java - 命名仅在构造后进行某些处理的类的最佳方法是什么?

java - 复制Postgres jdbc的正确使用方法

jdbc - java.sql.SQLException:<field_name>的验证失败: 'null'无法强制转换为double类型

java - "if (rs.next())"是什么意思?

java - 如何提高将数据库数据写入 CSV 的性能

java - 如何从多个 GUI 类集成多页 Java 桌面应用程序

mysql - 无法在jsf应用程序中将数据插入数据库

merge - 将多个查询作为一个结果处理

java - hibernate 保存时发生 StackOverflowError