2015-01-30 5 views
0

У меня довольно большой текстовый файл около 1,5 ГБ. Я должен разбирать файл по строкам и вставлять строки в базу данных Derby. Я читал много форумов о производительности и о том, как разбирать файл и т. Д. Моя проблема в том, что я сравнивал все мои процессы, и потребовалось бы прочитать и разобрать строку на 1 мс, как бы то ни было, я должен убедиться, что строка I Я пытаюсь вставить, не существует, если это тогда, я должен сделать некоторое обновление на нем. Эта часть процесса занимает около 9 мс.Разбор больших текстовых файлов и перемещение данных в базу данных

Всего 10 мс, что очень сильно говорит о том, что файл содержит около 10 миллионов строк.

Я использую PreparedStatement для запросов.

Есть ли способ ускорить часть запроса моего кода?

ответ

2

Включена ли в Autocommit?

dbConnection.setAutoCommit(false); 

Использование пакетной вставки вместо одного за другим, как здесь:

Connection dbConnection = null; 
    PreparedStatement preparedStatement = null; 

    String insertTableSQL = "INSERT INTO DBUSER" 
      + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
      + "(?,?,?,?)"; 

    try { 
     dbConnection = getDBConnection(); 
     preparedStatement = dbConnection.prepareStatement(insertTableSQL); 

     dbConnection.setAutoCommit(false); 

     preparedStatement.setInt(1, 101); 
     preparedStatement.setString(2, "mkyong101"); 
     preparedStatement.setString(3, "system"); 
     preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
     preparedStatement.addBatch(); 

     preparedStatement.setInt(1, 102); 
     preparedStatement.setString(2, "mkyong102"); 
     preparedStatement.setString(3, "system"); 
     preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
     preparedStatement.addBatch(); 

     preparedStatement.setInt(1, 103); 
     preparedStatement.setString(2, "mkyong103"); 
     preparedStatement.setString(3, "system"); 
     preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
     preparedStatement.addBatch(); 

     preparedStatement.executeBatch(); 

     dbConnection.commit(); 

     System.out.println("Record is inserted into DBUSER table!"); 

    } catch (SQLException e) { 

     System.out.println(e.getMessage()); 
     dbConnection.rollback(); 

    } finally { 

     if (preparedStatement != null) { 
      preparedStatement.close(); 
     } 

     if (dbConnection != null) { 
      dbConnection.close(); 
     } 

    } 

Посмотрите в: https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/tuning/tuningderby.pdf

+0

Мой друг, ты мой герой :) – Wermerb

0

Поскольку вы уже используете SQLiteStatement, единственное, что я могу придумать, это убедиться, что вы используете BufferedInputStream/BufferedOutputStream в своих операциях ввода-вывода.

редактировать мой плохой, этот ответ для андроида развития

+0

Он/Она специально указано: "в базу данных Derby". Apache Derby ** не ** SQLite. –

+0

aha, извините, просматривал андроидские вопросы, не знаю, как я оказался здесь:/ –

+0

Любые, как я использую BufferedInputStream, но спасибо за это, указав его – Wermerb