2013-06-26 1 views
4

Привет, я хотел бы создать таблицу через JDBC в нескольких базах данных, таких как DB2, Sybase, MySQL и т. Д. Теперь мне нужно создать эту таблицу, используя текстовый файл say data.txt, который содержит данные, разделенные пробелами. Напр.Поддерживает ли какой-либо драйвер JDBC команду LOAD DATA INFILE sql?

CustName OrderNo PhoneNo 

XYZ  230  123456789 
ABC  450  879641238  

Теперь этот data.txt содержит тысячи значений пробелов, разделенных пробелами. Мне нужно проанализировать этот файл строки за строкой, используя java io и выполнить sql-запросы для каждой записи.

Я обнаружил, что есть команда LOAD DATA INFILE sql. Поддерживает ли какой-либо драйвер JDBC эту команду? Если не то, что должно быть лучшим эффективным быстрым подходом к решению этой проблемы.

Просим руководствоваться. Заранее спасибо.

+1

Вы можете использовать 'load data infile' через JDBC (файл должен быть расположен на сервере!) - почему бы вам просто не попробовать? –

+1

@a_horse_with_no_name большое спасибо за ввод. Я читал, что команда LOAD DATA INFILE не поддерживается драйверами JDBC, поэтому я задал этот вопрос? – u449355

+0

Где вы это читали? Что случилось, когда вы пробовали? –

ответ

8

Следующее будет работать через JDBC. Обратите внимание, что для использования LOAD DATA INFILE вам нужна привилегия суперпользователя. Что вам не нужно для LOAD DATA LOCAL INFILE

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/foobar", "root", "password"); 
Statement stmt = con.createStatement(); 
String sql = 
    "load data infile 'c:/temp/some_data.txt' \n" + 
    " replace \n" + 
    " into table prd \n" + 
    " columns terminated by '\\t' \n" + 
    " ignore 1 lines"; 
stmt.execute(sql); 

Если вы используете LOAD DATA INFILE местоположение файла основан на файловой системе сервера! Если вы используете локальный файл, то, очевидно, он основан на файловой системе клиента.

+0

Большое спасибо за ответ. Я знаю, что этот код работает на MYSQL, но я хочу, чтобы он работал на Sybase, Oracle, DB2, и я сомневаюсь, что он будет работать на этих dbs. Поскольку вы являетесь экспертом по базам данных, пожалуйста, руководство. – u449355

+1

'LOAD DATA' - это специфичная для MySQL функция. Он недоступен ни в одной другой СУБД. Если вам нужен кросс-платформенный способ сделать это, вам придется самостоятельно проанализировать файл и создать «простые» инструкции INSERT для каждой строки. –

+0

Я думал, что мне все равно придется разбирать файл в любом случае, спасибо за руководство. – u449355

1

Я считаю, что LOAD DATA INFILE быстрее, чем разбор файла и вставка записей с использованием Java. Вы можете выполнить запрос для load data infile через JDBC. В соответствии с этим Oracle doc и MySql doc:

Оператор INFILE DATA НАГРУЗКИ читает строки из текстового файла в таблицу на очень высокой скорости.

Файл должен быть на сервере. Вы можете попробовать оба подхода, зарегистрировать время, которое каждый из них потребляет.

+0

Привет большое спасибо за ввод. Я подозреваю, что драйвер JDBC не поддерживает команду LOAD DATA INFILE sql. Вот почему я задал этот вопрос. Пожалуйста, направляйте. – u449355

4

Я думаю, что LOAD DATA INFILE специфичен для mySql, и я сомневаюсь, поддержит ли драйвер JDBC. Другие базы данных будут иметь аналогичные (но разные) утилиты

Если вы хотите сделать это зависит от базы данных, как я думаю, что у вас есть два варианта

  1. Разбирает вверх входной файл и использовать операторы SQL INSERT над JDBC подключение
  2. Написать ряд различных, зависимых сценариев базы данных, определить, какие СУБД вы используете и выполнить правильный используя Runtime.exec

Если у вас есть веские причины производительности не, я бы пойти на вариант 1 .

+1

'LOAD DATA' уверен, что работает через JDBC. –

+1

OK - спасибо за очистку. Но я предполагаю, что это mySql конкретный, хотя? OP требует что-то, что будет работать в нескольких базах данных, поэтому, если все поставщики Data Load утилиты работают через свои JDBC-драйверы, он все равно столкнется с проблемами. – DaveH

+0

Да, это зависит от MySQL. Некоторые СУБД поддерживают это посредством операторов SQL (например, 'COPY' для Postgres), некоторые из них не имеют инструкции SQL для массовой загрузки, а только для программ внешней командной строки. –

1

«Загрузка данных локального входной_файл» делает работу с драйвером JDBC MySQL, есть некоторые проблемы с этим.

При использовании «загрузки данных INFILE» или «загрузки данных локального входной_файл» вставленные записи НЕ будут добавлены в журнал бен, это означает, что если вы используете репликацию запись вставлена ​​«нагрузки data infile "не будет передаваться подчиненному серверу (серверам), в вставленные записи не будет записи транзакций, и именно поэтому информация о загружаемых данных намного быстрее, чем стандартная вставка и из-за отсутствия проверки на вставленные данные.