代码评审——程序中流、连接等关闭问题

2024-03-07 09:40

本文主要是介绍代码评审——程序中流、连接等关闭问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

在程序开发过程中,必然面临着与文件、数据库等进行交互。使用流等方式来建立连接,并进行操作,也成为了开发者的日常。但在开发过程中,对连接的回收、关闭等操作的管理,经常会被遗忘,从而引发问题。

可以看下这个举例的代码:

Connection con;
try {con = JDBC.createConnection("XXXX", prop);String query = "SELECT * FROM TABLENAME";Statement stat = con.createStatement();ResultSet res = stat.executeQuery(query);res.close();stat.close();
} catch (SQLException e) {e.printStackTrace();
} finally{if(stat != null){stat.close();}if(con != null){con.close();}
}

此时,使用静态代码扫描工具,会出现以下提示:
Use try-with-resources or close this “ResultSet” in a “finally” clause.

在这里插入图片描述


原因分析:

静态工具代码扫描工具给出的解释为:

Connections, streams, files, and other classes that implement the Closeable interface or its super-interface, AutoCloseable, needs to be closed after use. Further, that close call must be made in a finally block otherwise an exception could keep the call from being made. Preferably, when class implements AutoCloseable, resource should be created using “try-with-resources” pattern and will be closed automatically.
Failure to properly close resources will result in a resource leak which could bring first the application and then perhaps the box it’s on to their knees.

其实,从开发者的角度来说,这个问题非常常见,处理也很简单。但是经常会忽视这个问题,可能是遗忘,可能是漏写。上面的示例代码就可以看出,是漏写了,仅关闭了Statement和Connection。如果不进行关闭,非常容易造成资源的泄露。


解决方案:

解决方案也很简单,只需要在finally中增加对ResultSet的关闭即可。

Connection con;
try {con = JDBC.createConnection("XXXX", prop);String query = "SELECT * FROM TABLENAME";Statement stat = con.createStatement();ResultSet res = stat.executeQuery(query);res.close();stat.close();
} catch (SQLException e) {e.printStackTrace();
} finally{if(res != null){res.close();}if(stat != null){stat.close();}if(con != null){con.close();}
}

项目实际意义:

在项目开发过程中,最常使用的连接包括以下3项:

  • 文件流,包括字节流、字符流等等。
  • 数据库连接,redis等连接。
  • HTTP连接。

不关闭连接,很容易造成严重的结果。

  • 针对文件流等,如果不关闭,会造成文件写入错误,别的文件也无法读取这个文件。
  • 针对数据库连接,如果不关闭,会直接造成数据库的连接数暴涨(和访问这个服务的次数有关),最终造成数据库无法读写。虽然大多数情况下,会由对应的连接池(DB连接池或Redis连接池),来进行回收,但在业务实现上,也存在需要自己构建连接的情况。此时不关闭,甚至会造成项目的大型事故
  • 针对HTTP连接的情况,需要根据实际情况。如果需要不断交互,就不需要直接回收,否则就需要回收。

后面两种情况,因为有连接池的存在,经常会由连接池来进行销毁或回收等。

开发者在处理上述连接的过程中,如果不使用连接池等组件的情况,一定要及时关闭,否则很容易引起事故。

这篇关于代码评审——程序中流、连接等关闭问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783092

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造