2015-02-25 3 views
1

Мне нужно прочитать записи из файла CSV и сохранить их в базе данных Mysql.Как вставить записи быстрее

Я знаю о «LOAD DATA INFILE», но в моем случае мне нужно получить отдельную запись из файла, проверить, находится ли он в допустимом формате/длине и т. Д., А затем сохранить его в базе данных.

// list to store records from CSV file 
ArrayList<String> list = new ArrayList<String>(); 

//Read one line at a time 
while ((nextLine = reader.readNext()) != null) 
{ 
    for (String number : nextLine) 
    { 
     if (number.length() > 12 && number.startsWith("88")) 
     {   
     list.add(number); 
     } else if (number.length() > 9 && number.startsWith("54")) 
     { 
     list.add(number); 
     } 
     else if (number.length() > 8 && number.startsWith("99")) 
     { 
     list.add(number); 
     } 
     else 
     { 
     // .... 
     } 

     // method to insert data in database 
     insertInToDatabase(list);      
    } 
} 

и способ вставки записи в БД: taken from here

private void insertInToDatabase(ArrayList<String> list) 
{ 
    try 
    { 
     String query = "INSERT INTO mytable(numbers) VALUES(?)"; 

     prepStm = conn.prepareStatement(query); 

     for (String test : list) 
     { 
      prepStm.setString(1, test); 

      prepStm.addBatch();// add to batch 
      prepStm.clearParameters(); 
     } 

     prepStm.executeBatch(); 
    } 
} 

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

+0

Не могли бы вы дать более подробную информацию? Сколько строк соответствует CSV. содержат? Вы проверили, сколько времени прошло чтение файла/записи в БД? – eiselems

+0

прямо сейчас, для тестирования файла CSV содержится 90 тыс. Записей, и для вставки всех записей потребовалось приблизительно 45 минут. –

+0

Я имею в виду, вы проверили, сколько времени требуется для чтения и вставки? Вы можете просто вставить три System.out.println (System.currentTimeMillis()). Один до начала чтения, один после завершения считывания и один после вставки в db Таким образом, вы можете определить, действительно ли это вставка в db (или сам анализ), который так медленен – eiselems

ответ

0

@ ответ Khanna111 это хорошо.

Я не знаю, помогает ли она, но попробуйте проверить тип двигателя стола. Однажды я столкнулся с проблемой, в которой записи вставляются очень медленно. Я изменил двигатель от InnoDB до MyISAM, и вставка очень быстро.

0

Я думаю, что лучший подход - обработать файл csv с определенными правилами, а затем создать еще один csv из него, и как только будет готов выход csv. do load data infile.

будет довольно быстро.

0

Если вы хотите вставить через свое приложение, создайте пакетный запрос, подобный этому, и выполните на сервере MySQL.

String query = "INSERT INTO mytable(numbers) 
       VALUES (0), 
         (1), 
         (2), 
         (3)"; 
1

Вы должны использовать: «rewriteBatchedStatement», как это MYSQL оптимизация, которая пытается сократить обращений к серверу путем объединения вставки или обновления, как несколько пакетов, как это возможно.

Пожалуйста, обратитесь к: https://anonymousbi.wordpress.com/2014/02/11/increase-mysql-output-to-80k-rowssecond-in-pentaho-data-integration/

Кроме того, есть других оптимизаций, а в этой статье. Надеюсь, что это ускорит дозирование.

EDIT 1: Существует ясное объяснение этого параметра на этом сайте, а также: смотрите: MySQL and JDBC with rewriteBatchedStatements=true

+0

I попробовал добавить 'rewriteBatchedStatements = true', он вставляет очень быстро, за считанные секунды все записи вставлены. Но у меня есть уникальный индекс на поле, так что это дает мне исключение. [http://bugs.mysql.com/bug.php?id=6822]. В любом случае, на этом? –

+0

Это был бы другой вопрос, и люди могли бы ответить на него, как только спросите об этом. Так работает сайт. Вы можете решить эту проблему и спросить другую. – Khanna111

Смежные вопросы