Вставка 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
(..., ..., ..., ..., ..., ...);
Используя эту технику, вы вставляете несколько значений одновременно, что заканчивается одним и тем же результатом, но занимает меньше времени. Наслаждайтесь!