Привет, я пытаюсь получить более 50 тыс. Строк из одной из таблиц в базе данных MYSQL. Получение всех данных и их запись в текстовый файл занимает более 20 минут. Могу ли я использовать многопоточность, чтобы сократить время выборки и сделать код более эффективным. Любая помощь будет оценена по достоинству.

Я использовал обычное соединение JDBC и ResultSetMetaData для извлечения строк из таблицы.

String row = "";
    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select * from employee_details");
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
while (rs.next()) {
        for (int i = 1; i < columnCount; i++) {
            row = row + rs.getObject(i) + "|";// check
        }
        row = row + "\r\n";
    }

И я записываю полученные значения в текстовый файл, как показано ниже.

BufferedWriter writer = new BufferedWriter(new FileWriter(
    "C:/Users/430398/Desktop/file/abcd.txt"));
    writer.write(row);
    writer.close();
2
Basheer Ahmed 25 Ноя 2016 в 15:48

2 ответа

Лучший ответ

Сначала вам нужно определить, где находится узкое место. Это SQL-запрос? Или выборка строк через ResultSet? Или построение огромной струны? Или, может быть, запись файла?

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

0
Michal 26 Ноя 2016 в 19:31

Помните, что rs.next будет извлекать Результаты из БД в n пакетах. Где n - это число, определенное JDBC-Реализацией. Полагаю, сейчас 10. Таким образом, для каждых 10 пакетов он снова будет запрашивать БД, следовательно, будут накладные расходы сети - даже если он находится на том же самом компьютере.

Простое увеличение этого числа приведет к ускорению загрузки.

Редактировать: добавление этого <код> stmt.setFetchSize (50000); может быть так.

Имейте в виду, что это приводит к большому потреблению памяти.

1
The86Freak 25 Ноя 2016 в 13:32