JDBC ResultSet закрыт в Java после нескольких итераций - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с закрытием ResultSet.Что меня смущает, так это то, что он работает для части данных и затем закрывается.Сначала я подумал, что это может быть из-за тайм-аута соединения, но это не так.

Эта часть программы относится к сравнению книги .xlsx с уже существующей базой данных SQL и из-за отсутствиялучшего термина объединяет / обновляет его.

Во-первых, в моем классе CompareDatabase я вызываю функцию поиска, которая ищет в базе данных SQLite определенную строку каждые 6 итераций.

int columnCount = 6;
dataPoint = dataPoint.replaceAll("Detail", "");
String[] temp = dataPoint.trim().split("\\s+");
System.out.println(Arrays.toString(temp));
for (String tempDataPoint : temp) {
    if ( columnCount == 6) {
         System.out.println(search(tempDataPoint, connection));
    }
    columnCount = 0;
    } else {
         columnCount++;
    }
}

Эта функция поиска (также в классе CompareDatabase должна затем искать значение и возвращать строку (изначально была логической, но я хотел увидеть вывод).

private String search (String searchValue, Connection connection) throws SQLException {
    PreparedStatement pStatement = null;
    pStatement = connection.prepareStatement("SELECT * FROM lotdatabase where (Vehicle) = (?)");
    pStatement.setString(1, searchValue);

    try (ResultSet resultSet = pStatement.executeQuery()){
        return resultSet.getString(1);
    }finally {
        close(pStatement);
    }
}

ВВ конце вы можете увидеть, что PreparedStatement закрыт. ResultSet также должен быть закрыт автоматически (я где-то читал), но JDBC может быть ненадежным.

Однако Connection все еще открыт какон будет искать около 200+ строк, открывать и закрывать, что много раз не казалось хорошей идеей.

Эти функции вызываются моим main классом здесь:закомментировано, поскольку произойдет ошибка из-за нарушения первичного ключа.

public static void main(String[] args) {
    SQLDatabase sqlDatabase = new SQLDatabase();
    //sqlDatabase.convertToSQL("Database1.xlsx");
    sqlDatabase.compare("Database2.xlsx");
}

У меня есть подозрение, что я собираюсь описать это неправильно (в аспекте управления соединениями такого рода), и я был бы признателенссылка на то, где я могу научиться делать это правильно.

Кроме того, PreparedStatement может обрабатывать только один ResultSet Я не вижу в этом моей проблемы, так как закрываю ее каждую итерацию в for loop.

Если требуется больше кода или объяснения, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы помочь.

Спасибо, что нашли время, чтобы прочитать это.

1 Ответ

0 голосов
/ 16 октября 2018

Так что после того, как я немного погуглил и уснул, вот что сработало для меня.

Функция поиска в compareDatabase изменилась на следующее:

private Boolean search (String searchValue, Connection connection) {
    PreparedStatement ps = null;
    try {
        ps = connection.prepareStatement("SELECT * FROM lotdatabase where " +
                "(Vehicle) = (?)");
        ps.setString(1, searchValue);

        ResultSet resultSet = ps.executeQuery();

        //The following if statement checks if the ResultSet is empty.
        if (!resultSet.next()){
            resultSet.close();
            ps.close();
            return false;
        }else{
            resultSet.close();
            ps.close();
            return true;
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return false;
}

А в другомфункция в compareDatabase Я вызываю функцию search следующим образом:

if (search(tempDataPoint, connection)) {
      System.out.println("MATCH FOUND: " + tempDataPoint);
}else {
      System.out.println("NOT FOUND: " + tempDataPoint);
}

Это позволяет мне проверить ResultSet и также быть уверенным, что он закрыт.

...