packagecom.hy.insert.multithread;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Calendar;importjava.util.Date;importjava.util.List;importorg.apache.log4j.Logger;importcom.hy.DBParam;/*** 删单表线程
*@author逆火
*
* 2019年11月17日 上午9:24:39*/
public class InsertThread extendsThread{private static Logger log = Logger.getLogger(InsertThread.class);private final int BatchSize=250;//一次性插入记录数
private int tableIndex;//表序号
private String tableName;//tablename
private int count;//record count will be inserted
private String[] innerArr;//array contains field type and names
private InsertManager manager;//reference to InsertManager
/*** Constructor
*@paramtableIndex
*@paramtableName
*@paramcount
*@paraminnerArr
*@parammng*/
public InsertThread(int tableIndex,String tableName,intcount,String[] innerArr,InsertManager mng) {this.tableIndex=tableIndex;this.tableName=tableName;this.count=count;this.innerArr=innerArr;this.manager=mng;
}/*** Run body here*/
public voidrun() {
Connection conn= null;
Statement stmt= null;try{long startTime =System.currentTimeMillis();
Class.forName(DBParam.Driver).newInstance();
conn=DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd);
stmt=conn.createStatement();
log.info("Begin to access "+DBParam.DbUrl+" as "+DBParam.User+"...");
truncateTable(tableName,conn,stmt);
insertDataToTable(tableIndex,tableName,count,innerArr,conn,stmt);if(isAllInserted(count,tableName,stmt)) {long endTime =System.currentTimeMillis();
String timeElasped=sec2DHMS(startTime,endTime);
log.info("#"+tableIndex+" "+count+" records were inserted to table:'" + tableName + "' used " +timeElasped );
manager.reportFinished(String.valueOf(tableIndex), tableName, timeElasped);
}
}catch(Exception e) {
System.out.print(e.getMessage());
}finally{try{
stmt.close();
conn.close();
}catch(SQLException e) {
log.error("Can't close stmt/conn because of " +e.getMessage());
}
}
}/*** judge if all records are inserted
*@paramcount
*@paramtable
*@paramstmt
*@return*@throwsSQLException*/
private boolean isAllInserted(int count,String table,Statement stmt) throwsSQLException {
String sql="SELECT COUNT (*) as cnt FROM "+table;
ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {int cnt = rs.getInt("cnt");return cnt==count;
}return false;
}/*** get datetime n seconds before
*@paramn
*@paraminterval
*@return
*/
private static String getDatetimeBefore(int n,intinterval) {try{
Calendar now=Calendar.getInstance();
now.add(Calendar.SECOND,-n*interval);//鏃ユ湡鍑忓幓n*10绉�
Date newDate=now.getTime();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String retval=sdf.format(newDate);returnretval;
}catch(Exception ex) {
ex.printStackTrace();return null;
}
}/*** delete all data in a table quickly
*@paramtableName
*@paramconn
*@paramstmt
*@throwsSQLException*/
private void truncateTable(String tableName,Connection conn,Statement stmt) throwsSQLException{
String sql="truncate table "+tableName;
stmt.execute(sql);
log.info("truncated table:"+tableName);
}/*** Insert date to a table
*@paramtbSN
*@paramtableName
*@paramcount
*@paraminnerArr
*@paramconn
*@paramstmt
*@throwsSQLException*/
private void insertDataToTable(int tbSN,String tableName,int count,String[] innerArr,Connection conn,Statement stmt) throwsSQLException{//寰楀埌瀛楁鍚嶅拰瀛楁绫诲瀷
List typefields=new ArrayList();for(int i=1;i
String temp=innerArr[i];
String[] arrTmp=temp.split(":");
TypeField tf=newTypeField();
tf.type=arrTmp[0];
tf.field=arrTmp[1];
typefields.add(tf);
}
List fields=new ArrayList();
List values=new ArrayList();int index=0;for(TypeField tf:typefields) {
fields.add(tf.field);
values.add("''{"+index+"}''");
index++;
}int interval=2*365*24*60*60/count;//涓ゅ勾鐨勭鏁伴櫎浠ユ�讳釜鏁板嵆涓洪棿闅�
index=0;int times=count/BatchSize;for(int i=0;i
StringBuilder sb=newStringBuilder();
sb.append("INSERT ALL ");for(int j=0;j
index=i*BatchSize+j;
sb.append(getInsertSql(tableName,typefields,index,interval));
}
sb.append(" select * from dual");
String sql=sb.toString();//long startTime = System.currentTimeMillis();
stmt.executeUpdate(sql);//long endTime = System.currentTimeMillis();//log.info("#"+tbSN+"-"+i+" "+BatchSize+" records inserted to '"+tableName+"' used " + sec2DHMS(startTime,endTime));
}
}/*** get insert sql
*@paramtableName
*@paramtypefields
*@paramindex
*@return
*/
private String getInsertSql(String tableName,List typefields,int index,intinterval) {
String currTime=getDatetimeBefore(index,interval);
StringBuilder sb=newStringBuilder();
sb.append(" INTO "+tableName+"(");
List fields=new ArrayList();for(TypeField tf:typefields) {
fields.add(tf.field);
}
sb.append(String.join(",",fields));
sb.append(") values(");
List values=new ArrayList();for(TypeField tf:typefields) {if(tf.type.equals("PK")) {//values.add("'"+String.valueOf(index)+"'");
if(tableName.contains("DELIVERY_INFO_HISTORY")) {
values.add("'0'");
}else{
values.add("'"+String.valueOf(index)+"'");
}
}else if(tf.type.equals("CH")) {
values.add("'0'");
}else if(tf.type.equals("US")) {
values.add("'BatcherUser'");
}else if(tf.type.equals("DT")) {
values.add("to_date('"+currTime+"','yyyy-MM-dd HH24:mi:ss')");
}
}
sb.append(String.join(",",values));
sb.append(")");
String insertSql=sb.toString();returninsertSql;
}/*** change seconds to DayHourMinuteSecond format
*@paramstratMs
*@paramendMs
*@return
*/
private static String sec2DHMS(long stratMs,longendMs) {
String retval= null;long secondCount=(endMs-stratMs)/1000;long days = secondCount / (60 * 60 * 24);long hours = (secondCount % (60 * 60 * 24)) / (60 * 60);long minutes = (secondCount % (60 * 60)) / 60;long seconds = secondCount % 60;if (days > 0) {
retval= days + "d" + hours + "h" + minutes + "m" + seconds + "s";
}else if (hours > 0) {
retval= hours + "h" + minutes + "m" + seconds + "s";
}else if (minutes > 0) {
retval= minutes + "m" + seconds + "s";
}else{
retval= seconds + "s"";
}returnretval;
}/*** Inner class,used for inner data structure
*@author逆火
*
* 2019年11月17日 上午9:27:47*/
protected static final classTypeField{
String type;
String field;
}
}