У меня есть пакет Java, который соединяется с базой данных и получает некоторые данные.В некоторых редких случаях я получаю исключение кучи памяти, поскольку размер данных выборочного запроса превышает пространство кучи Java.Увеличение пространства кучи Java - это не то, о чем может подумать бизнес.
Другой вариант - перехватить исключение и продолжить выполнение, остановив выполнение.(Я знаю, что ловить OOME
не очень хорошая идея, но здесь меня затрагивают только локальные переменные).Мой код ниже:
private boolean stepCollectCustomerData() {
try {
boolean biResult = generateMetricCSV();
} catch (OutOfMemoryError e) {
log.error("OutOfMemoryError while collecting data ");
log.error(e.getMessage());
return false;
}
return true;
}
private boolean generateMetricCSV(){
// Executing the PAC & BI cluster SQL queries.
try (Connection connection = DriverManager.getConnection("connectionURL", "username", "password")) {
connection.setAutoCommit(false);
for (RedshiftQueryDefinition redshiftQueryDefinition: redshiftQueryDefinitions){
File csvFile = new File(dsarConfig.getDsarHomeDirectory() + dsarEntryId, redshiftQueryDefinition.getCsvFileName());
log.info("Running the query for metric: " + redshiftQueryDefinition.getMetricName());
try( PreparedStatement preparedStatement = createPreparedStatement(connection,
redshiftQueryDefinition.getSqlQuery(), redshiftQueryDefinition.getArgumentsList());
ResultSet resultSet = preparedStatement.executeQuery();
CSVWriter writer = new CSVWriter(new FileWriter(csvFile));) {
if (resultSet.next()) {
resultSet.beforeFirst();
log.info("Writing the data to CSV file.");
writer.writeAll(resultSet, true);
log.info("Metric written to csv file: " + csvFile.getAbsolutePath());
filesToZip.put(redshiftQueryDefinition.getCsvFileName(), csvFile);
} else {
log.info("There is no data for the metric " + redshiftQueryDefinition.getCsvFileName());
}
} catch (SQLException | IOException e) {
log.error("Exception while generating the CSV file: " + e);
e.printStackTrace();
return false;
}
}
} catch (SQLException e){
log.error("Exception while creating connection to the Redshift cluster: " + e);
return false;
}
return true;
}
Мы получаем исключение в строке "ResultSet resultSet = preparedStatement.executeQuery()"
в более позднем методе, и я ловлю это исключение в родительском методе.Теперь мне нужно убедиться, что в первом методе обнаружено исключение: GC уже активировал и очистил память локальных переменных?(например, переменная соединения и результирующего набора). Если нет, когда это произойдет?
Меня беспокоит пространство кучи Java, потому что это непрерывный поток, и мне нужно продолжать извлекать данные для других пользователей..
Код, который я предоставил, предназначен только для объяснения основной проблемы и потока и любезно игнорирует синтаксис и т. Д., Я использую JDK8
Заранее спасибо.