У меня около 1 миллиона записей в объекте ResultSet
, и я пытаюсь загрузить их в корзину s3. Я записываю каждую запись в файл, а затем загружаю его с помощью putObject. Я создаю JAR и загружаю его в папку s3. Затем я создаю рабочий процесс ooz ie с действием оболочки. Действие оболочки ищет местоположение JAR и запускает его.
Проблема - рабочий процесс занимал много времени. (около 7-8 часов)
Подход к решению проблемы - Многопоточность. Я делаю каждую задачу записи в файл / загрузки как выполняемую задачу и выполняю их с помощью ExecutorService.
Здесь я наткнулся на стену. Рабочий процесс при таком подходе работает нормально до 8–10 минут и загружает около 5000–6000 записей. Но затем его убивают, и в журналах отображается
Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
Вот часть кода -
ResultSet resultSet = statement.executeQuery();
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors);
while (resultSet.next()) {
String s1 = resultSet.getString(1);
String s2 = resultSet.getString(2);
String s3 = resultSet.getString(3);
executorService.execute(new Task(s1, s2, s3));
}
Это класс задачи -
private static class UploadTask implements Runnable {
String s1;
String s2;
String s3;
public UploadTask(String s1, String s2, String s3) {
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
}
@Override
public void run() {
File f1 = new File(FILE_PATH + s1);
File f2 = new File(FILE_PATH + s1 + s2);
Writer w1 = null;
Writer w2 = null;
try {
w1 = new FileWriter(f1);
w2 = new FileWriter(f2);
w1.write(s2);
w2.write(s1);
w1.close();
w2.close();
} catch (Exception e) {
log.error("Error while writing to file {}", e.getMessage());
}
s3Client.putObject(new PutObjectRequest(bucket,
key,
f1));
s3Client.putObject(new PutObjectRequest(bucket,
key,
f2));
f1.delete();
f2.delete();
}
}