JDBC: экспорт / импорт необработанных данных CSV из / в удаленную базу данных MySQL с использованием потоков - PullRequest
5 голосов
/ 20 января 2012

Веб-приложение, которое я сейчас разрабатываю, поддерживает экспорт CSV с (используя SELECT INTO OUTFILE) и импорт на (используя LOAD DATA INFILE) сервер MySQL, чтобы поддерживать огромные наборы данных, которые чрезвычайно дороги для обработки с использованием операторов SELECT и объемных операторов INSERT. в коде Java (наборы результатов обработки, кодирование строк, наследие бизнес-логики и т. д.). Эти CSV-файлы не управляются приложением, поэтому они просто представляют необработанное содержимое таблиц из базы данных MySQL. Но, насколько я понимаю, этот подход хорош, только если у меня есть локальные файлы, поэтому и сервер веб-приложений, и mysqld должны работать на одном компьютере.

В конфигурации приложения можно указать подключение к удаленной базе данных. Это, очевидно, означает, что загруженные CSV-файлы хранятся где-то локально на компьютере, на котором выполняется веб-приложение, поэтому я не могу указать расположение файла данных в операторе MySQL LOAD DATA INFILE. (Тот же сценарий для запроса загрузки CSV). Итак, я пытаюсь найти способ указать виртуальный файл CSV - используя поток ввода-вывода, который может обрабатываться JDBC и MySQL, аналогично управлению BLOB-объектами и т. Д.

Поддерживает ли JDBC / MySQL эту технику для файлов CSV для импорта и экспорта?

Заранее спасибо.

1 Ответ

4 голосов
/ 21 января 2012

Вы можете запустить LOAD DATA INFILE, используя опцию LOCAL, которая затем загрузит файл CSV, из которого выполняется клиент MySQL JDBC, используя com.mysql.jdbc.Statement#setLocalInfileInputStream.Например:

// conn is an existing java.sql.Connection to a remote server
try (Statement st = conn.createStatement()) {
    String localCsvFileSpec = "C:/Users/Jamie/Desktop/foo.csv";  // on this machine
    ((com.mysql.jdbc.Statement) st).setLocalInfileInputStream(
            new FileInputStream(localCsvFileSpec));
    st.execute(
            "LOAD DATA LOCAL INFILE '(placeholder)' " + 
            "INTO TABLE table01 " +
            "COLUMNS TERMINATED BY ',' " +
            "(id, txt) " + 
            "");
}

См. в этом сообщении для получения дополнительной информации.

К сожалению, похоже, что вы не можете использовать SELECT INTO OUTFILE для экспорта файлов в любое место, кромеваш сервер баз данных, с этот ответ на переполнение стека .

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