Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 异常编写小技巧

Java 异常编写小技巧

作者头像
猿芯
发布于 2021-08-24 06:44:30
发布于 2021-08-24 06:44:30
93600
代码可运行
举报
运行总次数:0
代码可运行

1 多个异常块 catch 写法

参考 Nacosnacos-config 子项的 BaseDatabaseOperate 类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
default Boolean update(TransactionTemplate transactionTemplate, JdbcTemplate jdbcTemplate,List<ModifyRequest> contexts, BiConsumer<Boolean, Throwable> consumer)

try {   
    return Boolean.TRUE;
} catch (BadSqlGrammarException | DataIntegrityViolationException e) {
    FATAL_LOG.error("[db-error] sql : {}, args : {}, error : {}", errSql[0], args[0], e.toString());
    return Boolean.FALSE;
}

当我们有多个异常需要相同异常处理时,可以采用 catch(XxxException | XxxExcetion) 方式处理,代码看起来也非常简洁和优雅。

2 资源关闭 try-with-resource

Jdk 1.7之后有了 try-with-resource 处理机制。

本地代码参考 Nacos 批量上传配置文件接口,关闭资源写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  try (DiskUtils.LineIterator iterator = DiskUtils.lineIterator(file)) {
    int batchSize = 1000;
    List<String> batchUpdate = new ArrayList<>(batchSize);
    List<CompletableFuture<Void>> futures = new ArrayList<>();
    List<Boolean> results = new CopyOnWriteArrayList<>();
    while (iterator.hasNext()) {
        String sql = iterator.next();
        if (StringUtils.isNotBlank(sql)) {
            batchUpdate.add(sql);
        }
        if (batchUpdate.size() == batchSize || !iterator.hasNext()) {
            List<ModifyRequest> sqls = batchUpdate.stream().map(s -> {
                ModifyRequest request = new ModifyRequest();
                request.setSql(s);
                return request;
            }).collect(Collectors.toList());
            futures.add(CompletableFuture.runAsync(() -> results.add(doDataImport(jdbcTemplate, sqls))));
            batchUpdate.clear();
        }
    }
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
    return RestResult.<String>builder()
            .withCode(BooleanUtils.and(results.toArray(new Boolean[0])) ? 200 : 500).withData("").build();
} catch (Throwable ex) {
    LogUtil.DEFAULT_LOG.error("An exception occurred when external data was imported into Derby : {}", ex);
    return RestResultUtils.failed(ex.getMessage());
}

示例代码 try (DiskUtils.LineIterator iterator = DiskUtils.lineIterator(file)) 包含文件流读取,所以符合 try-with-resource,不需要开发者手动关闭文件流资源。

往期推荐

  1. 肝九千字长文 | MyBatis-Plus 码之重器 lambda 表达式使用指南,开发效率瞬间提升80%
  2. 用 MHA 做 MySQL 读写分离,频繁爆发线上生产事故后,泪奔分享 Druid 连接池参数优化实战
  3. 微服务架构下,解决数据库跨库查询的一些思路
  4. 一文读懂阿里大中台、小前台战略

< END >

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构荟萃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RocketMQ实战—10.营销系统代码优化二
首先营销系统对全量用户发放优惠券的任务进行分片,然后将分片的消息发送到如下Topic。
东阳马生架构
2025/04/18
920
高并发性能优化随笔
在我的高并发技巧系列文章中,我已经介绍了不少性能优化的技巧。为了保证这篇文章的完整性,可能会有一些重复。本文将重点介绍 C 端开发中常用的中间件(MySQL、Redis、MQ、RPC)如何提高性能,并在最后介绍一些奇淫巧技。
用户11397231
2025/01/24
1430
高并发性能优化随笔
聊聊PushConsumer与SimpleConsumer拉取消息的区别
本文主要研究一下rocketmq5的PushConsumer与SimpleConsumer拉取消息的区别
code4it
2024/08/11
1760
【掌印日记-点赞功能实现】使用Redis实现分布式锁
在项目开发中,点赞事件频率较高,我们不可能直接将对点赞功能的操作放到MySQL里面,所以我们引入Redis中间件。
Karos
2023/01/16
1.2K0
队列机组件实现
对比单机环境下的模型来看,分布式环境的队列机更为复杂,阻塞队列当然不能再使用java提供的工具类,本文使用redis作为队列,使用redis哪种数据类型作为存储方式呢,这里选择zset,不仅仅是为了实现生产消费,结合zset数据结构,而且还可以实现延迟队列。下面介绍延迟队列机的组件实现方式。
LiosWong
2021/12/01
2670
队列机组件实现
聊聊nacos的DataSyncer
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/consistency/ephemeral/distro/DataSyncer.java
code4it
2019/09/07
4810
聊聊nacos的DataSyncer
5. SOFAJRaft源码分析— RheaKV中如何存放数据?
上一篇讲了RheaKV是如何进行初始化的,因为RheaKV主要是用来做KV存储的,RheaKV读写的是相当的复杂,一起写会篇幅太长,所以这一篇主要来讲一下RheaKV中如何存放数据。
luozhiyun
2019/11/12
1.5K0
5. SOFAJRaft源码分析— RheaKV中如何存放数据?
Java面试题之List(一)
我们都知道,Java面试中避免不了的要涉及到对各种框架和源码的盘问。有的面试官会直接点,问我们对ArrayList的源码的理解,有的会间接的提问。
黑洞代码
2021/01/14
4350
Nacos8# 集群中节点之间健康检查
当新的节点加入集群或者集群中有节点下线了,集群之间可以通过健康检查发现。健康检查的频率是怎么样的?节点的状态又是如何变动的?状态的变动又会触发什么动作。带着这些问题本文捋一捋。
瓜农老梁
2021/07/14
2.5K0
Spark 实现MySQL update操作
背景 目前 spark 对 MySQL 的操作只有 Append,Overwrite,ErrorIfExists,Ignore几种表级别的模式,有时我们需要对表进行行级别的操作,比如update。即我
UFO
2018/08/29
3.3K0
“多线程去刷一张大表数据,发现任务老是中断,怎么解决?”
会有10个任务同时执行,在这10个任务未结束前,新添加的任务会放到等待队列,当队列中存够500个任务时,则会报错,不会新启动线程来处理任务,因为maxPoolSize是10与corePoolSize相同。
烟雨平生
2025/01/19
790
“多线程去刷一张大表数据,发现任务老是中断,怎么解决?”
Spring Boot 处理百万级别数据量解决方案
Spring Boot 处理百万级别的数据量时,常见的挑战包括内存溢出(OOM)、性能低下、数据库连接管理等问题。以下是一些解决策略和相应的代码示例概要: 1. 导出百万级数据 - 分页查询 + 流式处理: - 使用`ResultSet`的流式API或者JPA/Hibernate的分页查询,逐页读取数据,避免一次性加载所有数据到内存。 // JPA分页查询示例 Pageable pageable = PageRequest.of(pageNumber, pageSize); Page<T> dataPage = repository.findAll(pageable); // JDBC流式查询示例(假设使用JdbcTemplate) jdbcTemplate.query(sql, (rs, rowNum) -> { // 处理每一行数据,立即写出到OutputStream或Writer // 不积累在内存中 }, params...);
用户7353950
2024/04/16
1.4K0
Spring Boot 处理百万级别数据量解决方案
Java 代码精简之道
其中:“道”指“规律、道理、理论”,“术”指“方法、技巧、技术”。意思是:“道”是“术”的灵魂,“术”是“道”的肉体;可以用“道”来统管“术”,也可以从“术”中获得“道”。
JAVA葵花宝典
2020/06/04
2.1K0
用 Spring AOP 优化 IN 查询,效率提升巨大!
我们在项目中经常遇到IN查询,同时IN的参数太多甚至大几百上千,会导致PG性能下降严重进而接口反应太慢。这个应该是前期没规划好,但是事已至此还是要对此进行优化。第一个就是想到通过多线程去查,比如原来是
用户1220090
2025/02/05
1200
用 Spring AOP 优化 IN 查询,效率提升巨大!
多种格式文件合并为pdf(大数据量)
最近遇到了一个比较恶心的需求,就是用户为了安全性,本地的富文本文件不存放到我们的minio中,而是富文本的原件存在了客户的服务器中,但是我们只能在数据库存放对应的路径。 富文本与档案的绑定关系是多对一,也就是多个富文本绑定一个档案,现在有个问题就是我们系统都是档案都是以pdf进行展示的,而客户那边档案下对应的富文本是多种数据类型的包括以下几种:jpg,png,jpeg,pdf,tif,tiff 所以我要去做兼容也就是说需要把档案下对应的各种格式的富文本拼接成一个pdf,然后再去展示。
用户10136162
2023/10/30
3000
Java 代码精简之道 (上)
从 Java 5 起,提供了 for-each 循环,简化了数组和集合的循环遍历。for-each 循环允许你无需保持传统 for 循环中的索引就可以遍历数组,或在使用迭代器时无需在 while 循环中调用 hasNext 方法和 next 方法就可以遍历集合。
码农架构
2020/10/29
3420
Java 代码精简之道 (上)
Mybatis Plus 批量插入性能优化,非常实用!
物联网平台背景,传感器采集频率干到了1000Hz,分了100多张表出来,还是把mysql干炸了。当前单表数据量在1000来w,从kafka上拉数据异步批量插入,每次插入数据量1500条,测试的时候还没问题,结果上线没多久,kafka服务器直接挂了,赶忙看日志,kafka服务器堆积了几十G的数据,再去看生产环境日志,发现到最后单次批量插入用时固定在10多秒,甚至20多秒,kafka直接把消费端踢出了消费组…从而kafka消息一直没有消费,总重导致kafka数据堆积挂掉了…
码猿技术专栏
2023/05/01
7.6K2
Mybatis Plus 批量插入性能优化,非常实用!
Nacos6# Distro协议全量同步与校验
本文接着撸Distro协议,上文中分析了寻址模式。有了地址就要建立连接,有了连接就能通信了。集群之间都交互啥数据?本文就扒一扒全量同步和节点之间数据校验。
瓜农老梁
2021/07/14
9700
聊聊canal的CanalAdapterWorker
canal-1.1.4/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterWorker.java
code4it
2020/04/05
9900
聊聊nacos config的deleteConfig
nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java
code4it
2019/10/22
6020
聊聊nacos config的deleteConfig
相关推荐
RocketMQ实战—10.营销系统代码优化二
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验