@JFinal protected int[] batch(Config config, Connection conn, String sql, String columns, List list, int batchSize) throws SQLException { if (list != null && list.size() != 0) { Object element = list.get(0); if (!(element instanceof Record) && !(element instanceof Model)) { throw new IllegalArgumentException("The element in list must be Model or Record."); } else if (batchSize < 1) { throw new IllegalArgumentException("The batchSize must more than 0."); } else { boolean isModel = element instanceof Model; String[] columnArray = columns.split(",");
for(int i = 0; i < columnArray.length; ++i) { columnArray[i] = columnArray[i].trim(); }
boolean isInTransaction = config.isInTransaction(); int counter = 0; int pointer = 0; int size = list.size(); int[] result = new int[size]; PreparedStatement pst = conn.prepareStatement(sql);
for(int i = 0; i < size; ++i) { Map map = isModel ? ((Model)list.get(i))._getAttrs() : ((Record)list.get(i)).getColumns();
for(int j = 0; j < columnArray.length; ++j) { Object value = map.get(columnArray[j]); if (value instanceof Date) { if (value instanceof java.sql.Date) { pst.setDate(j + 1, (java.sql.Date)value); } else if (value instanceof Timestamp) { pst.setTimestamp(j + 1, (Timestamp)value); } else { Date d = (Date)value; pst.setTimestamp(j + 1, new Timestamp(d.getTime())); } } else { pst.setObject(j + 1, value); } }
pst.addBatch(); ++counter; if (counter >= batchSize) { counter = 0; int[] r = pst.executeBatch(); if (!isInTransaction) { conn.commit(); }
for(int k = 0; k < r.length; ++k) { result[pointer++] = r[k]; } } }
int[] r = pst.executeBatch(); if (!isInTransaction) { conn.commit(); }
for(int k = 0; k < r.length; ++k) { result[pointer++] = r[k]; }
很可能是网络原因或者是数据库本身就慢