Секционированный пакет JSR352 поддерживает поток в течение долгого времени - PullRequest
0 голосов
/ 07 февраля 2019

Я разделил шаг в моей работе, которая считывает данные из базы данных и генерирует файл.Картографирование разделов инициализируется на основе количества отчетов, напримерон устанавливает 100 разделов и 5 потоков.И он собирается сгенерировать 100 файлов, используя 100 различных запросов.Если все запросы выполняются нормально, значит, задание выполняется успешно.но, когда читатель потерпел неудачу из-за тайм-аута запросов, он закрывает соединение писателя и читателя, но не собирается и не обновляет таблицы пакетных метаданных, как только.Скорее потоки зависают на некоторое время и обновляются до таблицы метаданных пакета.И это влияет на последующие темы.

Интересным моментом здесь является то, что сбой первого потока работает точно так же, как упомянутое время ожидания (15 минут).Когда следующий поток потерпел неудачу, он занимает больше времени, например, 15 + 15 = 30 минут.Впоследствии, это добавляет время предыдущего потока и заканчивается продолжительным заданием.

Это происходит только тогда, когда потоки начинают отказывать по какой-либо причине (В моем случае, тайм-аут запроса).Похоже, поток не очищает ресурс должным образом, когда его получение не удалось.И это оставляет нить в живых на долгое время.Считыватель открывает соединение и набор результатов.метод close, закрывающий соединение и набор результатов.

In Reader open()
con = dataSource.getConnection();
resultSet=null;
preparedStatement = con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
try {
resultSet = preparedStatement.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}

Reader close()
if(!resultSet.isClosed()) {
resultSet.close();
}
preparedStatement.close();
con.close();

Partition class;
partitionPlan.setThreads(getThreadCount());
partitionPlan.setPartitions(numberOfPartitions); //numberOfPartitions count comes from another dao.
for (int idx = 0; idx < numberOfPartitions; idx++) {
Properties threadProperties = new Properties();
threadProperties.setProperty("threadNumber", idx + "");
threadProperties.setProperty("sqlId", dynSqlId); //each thread will be set with some sql query.
props[idx] = threadProperties;
}
partitionPlan.setPartitionProperties(props);
return partitionPlan;

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

...