Вставка 1 миллиона записей в БД с использованием JDBC BatchUpdate. Каждая строка содержит 6 определенных значений, разделенных знаком "#".

Я читаю текстовый файл, содержащий около 1 миллиона записей. Каждая строка имеет 6 определенных значений, разделенных "#". Я использую BufferedReader, чтобы читать это построчно, и использую StringTokenzier, чтобы разбить его соответственно. Затем я сохраняю этот токен, разделив строки на переменные, создавая вставку запроса, добавляя этот запрос в пакет и обновляя его. Но это займет 1 час только для вставки 1,50000(приблизительно). И где-то я прочитал, что BatchUpdate займет всего 6 секунд для вставки 1,50000 записей.

Пожалуйста, предложите? Здесь я сгенерировал filepath через contstructor, так что игнорируйте это.

Вот мой код для вставки

class CallLog extends Thread
{
    private String var_callerNumber;
    private String var_shortCode;
    private String var_crbt_callDate;
    private String var_crbt_startTime;
    private String var_crbt_endTime;
    private String var_crbt_duration;
    private String val_filename="";
    private String filepath="";
    String line="";
    int nToken=0;
    Connection con=null;
    BufferedReader reader;

try {
            logger.info("Final call_log file path is "+filepath);

            Statement st=con.createStatement();
            PreparedStatement pst=con.prepareStatement("insert into tbl_crbt_calllog(caller_no,short_code,call_date,start_time,end_time,duration) values(?,?,?,?,?,?)");
            File file =new File(filepath);

            reader=new BufferedReader(new FileReader(file));

            while((line=reader.readLine())!=null)
            {
                /*line=reader.readLine();*/
                StringTokenizer token = new StringTokenizer(line,"#");
                nToken=token.countTokens();
                if(nToken==6)
                {
                    var_callerNumber=token.nextToken().trim();
                    var_shortCode=token.nextToken().trim();
                    var_crbt_callDate=token.nextToken().trim();
                    var_crbt_startTime=token.nextToken().trim();
                    var_crbt_endTime=token.nextToken().trim();
                    var_crbt_duration=token.nextToken().trim();

                    pst.setString(1, var_callerNumber);
                    pst.setString(2, var_shortCode);
                    pst.setString(3, var_crbt_callDate);
                    pst.setString(4, var_crbt_startTime);
                    pst.setString(5, var_crbt_endTime);
                    pst.setString(6, var_crbt_duration);

                    pst.addBatch();

                }

                else
                {
                    logger.info("No of Token is greater or less then 6 "+line);
                }

            }
            pst.executeBatch();
            con.close();


        } catch (Exception e) {

            e.printStackTrace();
        }

        finally
        {
            if(reader!=null)
            {
                try {
                    reader.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Я также попробовал Apporach размера партии, но он также не работал для меня

pst.addBatch();

                        if(batchsize++==10000)
                        {
                            System.out.println("Uploading batchSize of "+ 
                            batchsize);
                            pst.executeBatch();
                            pst.clearBatch();
                            batchsize=0;
                        }

                        if(batchsize>0)
                        {
                            pst.executeBatch();
                        }

Вот мой пример файла

237664016726#811#20190218#220207#000207#3600 237665946738#811#20190218#222747#002747#3600 237664016726#811#20190218#224234#004234#3600 237661183627#81152#20190219#0207 0207

1 ответ

Вам нужно вставить несколько записей одновременно при выполнении операторов SQL. Таким образом, вы бы использовали оператор вставки следующим образом:

INSERT INTO tbl_crbt_calllog
  (caller_no, short_code, call_date, start_time, end_time, duration)
VALUES
  (..., ..., ..., ..., ..., ...),
  (..., ..., ..., ..., ..., ...),
  (..., ..., ..., ..., ..., ...),
  (..., ..., ..., ..., ..., ...),
  [...]
  (..., ..., ..., ..., ..., ...),
  (..., ..., ..., ..., ..., ...),
  (..., ..., ..., ..., ..., ...);

И НЕ так:

INSERT INTO tbl_crbt_calllog
  (caller_no, short_code, call_date, start_time, end_time, duration)
VALUES
  (..., ..., ..., ..., ..., ...);

Используя эту технику, вы вставляете несколько значений одновременно, что заканчивается одним и тем же результатом, но занимает меньше времени. Наслаждайтесь!

Другие вопросы по тегам