怎样优化批量改名java_【Java】批量操作优化

批量获取

开发中,有时候难免需要用到类似findAll()方法,或者说获取表中所有数据。但是当这个量很大时,一次性从数据库中加载到内存中,明显不理智。这时候可以采用批量取的方式,比如batchSize为500。

/**

* 批量获取任务,删除任务

*/

private void cleanTask() {

ListprojectIds = getAllProjectIds();

if (isNotEmpty(projectIds)) {

int skip = 0;

Listres = null;

do {

res = taskService.findAll(skip, batchSize);

if (res == null || res.isEmpty()) {

break;

}

deleteBatchTask(projectIds, res);

skip = skip + batchSize;

} while (res.size() == batchSize);

}

}

批量删除

在执行删除操作时,通常我们会foreach遍历着删,但是遍历一次就是与数据库的一次交互。更常见地,每一次删除时,还会有很多相关的级联删除操作,这样更加拉低了页面的相应。有几个地方可以优化:比如采用线程池来执行整个的批量删除操作;比如可以先做假删除,在夜深人静时采用定时任务来删除;再比如,采用批量删除,也就是in语句。这里主要说的也是第三种,但是如果采用in进行批量删除,也需要注意,不能过分信任in的批量,如果数据量过大,一次性in上万条,数据库也扛不住,此时就可以对in再进行批量。

// 批量删除任务

Functional.batchExec(taskIds, delIds -> taskDAO.deleteTaskTrue(delIds), batchSize);

/**

* 批量删除(真删除)

*

* @param taskIds 任务ids

*/

public void deleteTaskTrue(ListtaskIds) {

createDelete().where().in("_id", taskIds).delete();

}

public class Functional {

/**

* 将集合按指定分批大小进行分批操作

*

* @param src

* @param function

* @param batchSize

* @param */

public static void batchExec(Listsrc, Consumer> function, int batchSize) {

if (src == null || src.isEmpty()) {

return;

}

if (batchSize <= 0) {

batchSize = 1;

}

int loopTimes;

if (src.size() % batchSize == 0) {

loopTimes = src.size() / batchSize;

} else {

loopTimes = src.size() / batchSize + 1;

}

for (int i = 0; i < loopTimes; i++) {

ListsubList;

if (i == src.size() / batchSize) {

subList = src.subList(i * batchSize, src.size());

} else {

subList = src.subList(i * batchSize, (i + 1) * batchSize);

}

function.accept(subList);

}

}

/**

* 正序排序

*

* @param src

* @param field

*/

public static void ascSort(List src, String field) {

sort(src, field, 1);

}

/**

* 逆序排序

*

* @param src

* @param field

*/

public static void descSort(List src, String field) {

sort(src, field, -1);

}

private static void sort(List src, String field, int direction) {

if (ValidateUtil.isEmpty(src)) {

return;

}

Collections.sort(src, new Comparator() {

@Override

public int compare(Object o1, Object o2) {

Object value1 = BeanUtil.pojo.getProperty(o1, field);

Object value2 = BeanUtil.pojo.getProperty(o2, field);

if (value1 != null && value2 != null) {

if (value1 instanceof Long) {

return ((Long) value1).compareTo((Long) value2) * direction;

}

if (value1 instanceof Integer) {

return ((Integer) value1).compareTo((Integer) value2) * direction;

}

if (value1 instanceof Double) {

return ((Double) value1).compareTo((Double) value2) * direction;

}

if (value1 instanceof BigDecimal) {

return ((BigDecimal) value1).compareTo((BigDecimal) value2) * direction;

}

if (value1 instanceof Date) {

return ((Date) value1).compareTo((Date) value2) * direction;

}

if (value1 instanceof String) {

return ((String) value1).compareTo((String) value2) * direction;

}

}

return 0;

}

});

}

/**

* 除重

*

* @param src

* @param * @return

*/

public static Listdistinct(Listsrc) {

if (ValidateUtil.isEmpty(src)) {

return src;

}

return new ArrayList(src.stream().collect(Collectors.toSet()));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值