jfinal batchSave 200 条数据 耗时19秒左右 jfinal 批量的时候需要每个对象属性遍历一遍 然后赋值 就是这个地方慢. 请问怎么解决

jfinal batchSave 200 条数据 耗时19秒左右 jfinal 批量的时候需要每个对象属性遍历一遍 然后赋值 就是这个地方慢.  请问怎么解决

评论区

JFinal

2018-07-30 10:28

单步调试,看是哪一步慢了, 200 条数据 19 秒这个在正常情况下是不可能的,除非是有死锁或者是每条数据的数据量巨大

很可能是网络原因或者是数据库本身就慢

351539365

2018-07-30 12:33

@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];
}

DbKit.close(pst);
return result;
}
} else {
return new int[0];
}
}
这个方法遍历属性的时候很耗时间 ,commit的时候很快

351539365

2018-07-30 12:44

时间全耗在了 835到867行这个地方了

351539365

2018-07-30 12:46

我分别在833行 和 869行 打了两个断点 从第一个断点调到第二个断点 耗时就是19秒左右

北流家园网

2018-08-17 18:24

楼主解决了吗

351539365

2018-08-20 10:28

解决了 数据库网络的问题

热门反馈

扫码入社