Должен ли я объявить КАЖДЫЙ ресурс в заявлении о попытках использования ресурсов? - PullRequest
2 голосов
/ 22 марта 2019

Во многих примерах поиска с ресурсом, которые я искал, Statement и ResultSet объявляются отдельно. Как упоминалось в документе Java, методы закрытия ресурсов вызываются в порядке, обратном их созданию.

try (Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(sql) ) {

} catch (Exception e) {

}

Но теперь у меня есть несколько запросов в моей функции.

Могу ли я сделать Statement и ResultSet в одну строку? Мой код как:

try (ResultSet rs = con.createStatement().executeQuery(sql);
     ResultSet rs2 = con.createStatement().executeQuery(sql2);
     ResultSet rs3 = con.createStatement().executeQuery(sql3)) {

} catch (Exception e) {

}

Если я объявляю их только в одной строке, закрывает ли он все ресурсы ResultSet и Statement?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Когда вы внимательно посмотрите, вы увидите, что концепция называется try-with-resource s .

Обратите внимание на множественное число!Идея заключается в том, что вы можете объявить один или несколько ресурсов в этом единственном утверждении, а jvm гарантирует правильную обработку.

Другими словами: когда ресурсы семантически связаны друг с другом, рекомендуется объявлять их вместе.

0 голосов
/ 22 марта 2019

Да, и это работает точно так, как вы задали это в своем вопросе, несколько утверждений, разделенных точкой с запятой.

Вы можете объявить один или несколько ресурсов в инструкции try-with-resources. В следующем примере извлекаются имена файлов, упакованных в zip-файл zipFileName, и создается текстовый файл, содержащий имена этих файлов:

 try (
    java.util.zip.ZipFile zf =
         new java.util.zip.ZipFile(zipFileName);
    java.io.BufferedWriter writer = 
        java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
    // Enumerate each entry
    for (java.util.Enumeration entries =
                            zf.entries(); entries.hasMoreElements();) {
        // Get the entry name and write it to the output file
        String newLine = System.getProperty("line.separator");
        String zipEntryName =
             ((java.util.zip.ZipEntry)entries.nextElement()).getName() +
             newLine;
        writer.write(zipEntryName, 0, zipEntryName.length());
    }
}

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

ResultSet реализует AutoCloseable, что означает, что try-with-resources также принудительно закроет его по окончании использования.

https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

...