package io.mycat.performance; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; public class UserTableInsertJob implements Runnable { private long finsihed; private final long batchSize; private final AtomicLong finshiedCount; private final AtomicLong failedCount; private final SimpleConPool conPool; private final long totalRecords; private LinkedList<StringItem> sqlTemplateItems; private final boolean autocommit; public UserTableInsertJob(SimpleConPool conPool, long totalRecords, long batchSize, AtomicLong finshiedCount, AtomicLong failedCount, LinkedList<StringItem> sqlTemplateItems, boolean autoCommit) { super(); this.conPool = conPool; this.totalRecords = totalRecords; this.batchSize = batchSize; this.finshiedCount = finshiedCount; this.failedCount = failedCount; this.sqlTemplateItems = sqlTemplateItems; this.autocommit = autoCommit; } private long insert(Connection con, List<String> list) throws SQLException { Statement stms = con.createStatement(); for (String sql : list) { stms.addBatch(sql); } stms.executeBatch(); if (!this.autocommit) { con.commit(); } // stms.clearBatch(); stms.close(); return list.size(); } private List<String> getNextBatch() { if (finsihed >= totalRecords) { return Collections.emptyList(); } int curBatchSize = (int) ((finsihed + batchSize) < totalRecords ? batchSize : (totalRecords - finsihed)); ArrayList<String> list = new ArrayList<String>(curBatchSize); for (long i = 0; i < curBatchSize; i++) { list.add(RandomDataValueUtil.evalRandValueString(sqlTemplateItems)); } // System.out.println("finsihed :" + finsihed + "-" + end); finsihed += list.size(); return list; } @Override public void run() { Connection con = null; try { List<String> batch = getNextBatch(); while (!batch.isEmpty()) { try { if (con == null || con.isClosed()) { con = conPool.getConnection(); if (con.getAutoCommit() != autocommit) { con.setAutoCommit(autocommit); } } insert(con, batch); finshiedCount.addAndGet(batch.size()); } catch (Exception e) { System.out.println("caught err in thread :" + Thread.currentThread().getId() + " " + e); try { con.rollback(); } catch (SQLException e1) { System.out.println("caught err in thread :" + Thread.currentThread().getId() + " rollback err " + e1); } failedCount.addAndGet(batch.size()); } batch = getNextBatch(); } } finally { if (con != null) { this.conPool.returnCon(con); } } } }