GenericObjectPool 避免泄漏

news/2023/12/9 17:08:26 标签: java, 数据库

更多内容,请访问 https://my.oschina.net/u/5751...

GenericObjectPool

GenericObjectPool 是 Apache Commons Pool 提供的对象池,使用的时候需要调用 borrowObject 获取一个对象,使用完以后需要调用 returnObject 归还对象,或者调用 invalidateObject 将这个对象标记为不可再用。

实际应用中由于程序实现的问题,可能造成在一些极端的情况下出现 borrowObject/invalidateObject 没有被调用导致的泄漏问题。对象泄漏会导致对象池中的对象数量一直上升,达到设置的上限以后再调用 borrowObject 就会永远等待或者抛出 java.util.NoSuchElementException: Timeout waiting for idle object 异常。

对于这种问题,一方面是从应用实现上进行排查,另一方面可以通过 GenericObjectPool 自带的机制进行清理。

设置自动清理

设置抛弃时间

GenericObjectPool判断一个对象是否泄漏是根据对象最后一次使用或者最后一次borrow的时间进行判断的,如果超出了预设的值就会被认为是一个泄漏的对象被清理掉(PooledObjectFactory.destroyObject在这一过程中会被调用)。抛弃时间可以通过 AbandonedConfig.setRemoveAbandonedTimeout 进行设置,时间单位是秒。

打开泄漏清理

设置了抛弃时间以后还需要打开泄漏清理才会生效。泄漏判断的开启可以通过两种方式:

  1. 从对象池中获取对象的时候进行清理
    如果当前对象池中少于2个idle状态的对象或者 active数量>最大对象数-3 的时候,在borrow对象的时候启动泄漏清理。通过 AbandonedConfig.setRemoveAbandonedOnBorrow 为 true 进行开启。

  2. 启动定时任务进行清理
    AbandonedConfig.setRemoveAbandonedOnMaintenance 设置为 true 以后,在维护任务运行的时候会进行泄漏对象的清理,可以通过 GenericObjectPool.setTimeBetweenEvictionRunsMillis 设置维护任务执行的时间间隔。


GenericObjectPool<PoolObj> pool = new GenericObjectPool<PoolObj>(new MyPooledObjectFactory(),config);

AbandonedConfig abandonedConfig = new AbandonedConfig();

abandonedConfig.setRemoveAbandonedOnMaintenance(true); //在Maintenance的时候检查是否有泄漏

abandonedConfig.setRemoveAbandonedOnBorrow(true); //borrow 的时候检查泄漏

abandonedConfig.setRemoveAbandonedTimeout(10); //如果一个对象borrow之后10秒还没有返还给pool,认为是泄漏的对象

pool.setAbandonedConfig(abandonedConfig);

pool.setTimeBetweenEvictionRunsMillis(5000); //5秒运行一次维护任务

http://www.niftyadmin.cn/n/1385357.html

相关文章

微信小程序+UI框架

小程序基础样式库、star数为截至2021年1月27日统计 ColorUI 1、start 10.1k 2、鲜亮的高饱和色彩&#xff0c;专注视觉的小程序组件库 3、GitHub 地址&#xff1a;https://github.com/weilanwl/ColorUI 4、开发文档参考&#xff08;编辑中&#xff09;&#xff1a;https://www.…

《深入浅出 Java Concurrency》目录

2019独角兽企业重金招聘Python工程师标准>>> 整个文集快进行到1/3了才想到是否应该列出个目录出来。 其实从去年有这个计划开始&#xff0c;一直就想完整、系统的梳理下知识点&#xff0c;包括哪些常见的和不常见&#xff0c;甚至比较“生涩”的理论知识&#xff0c…

java二维码的生成与解析代码

二维码&#xff0c;是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字、图片、网址等信息的条码图片。如下图 二维码的特点&#xff1a; 1. 高密度编码&#xff0c;信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节&#xff0c;或500多个汉字&#…

微信小程序+Node服务器

将数据提交到服务器&#xff0c;通过小程序中的网络API wx.request()实现 对于正式上线的项目&#xff0c;小程序要求服务器域名必须在小程序管理后台中添加 域名必须经过ICP备案&#xff0c;且只支持HTTPS和WSS协议。 需要在本地搭建一个HTTP服务器&#xff0c;选择Node.js进行…

c#基础(二)

1.bool数据类型&#xff0c;非真即假&#xff0c;true&#xff0c;false。 2.关系运算符&#xff1a;>,>,<,<,&#xff08;等于&#xff09;,!(不等于)。 注意&#xff1a;两个相等用“”&#xff0c;一个“”为赋值。 3.逻辑运算符&#xff1a;结果也是非真即假。…

永不止步的网络基础1.2TCP/IP模型

2019独角兽企业重金招聘Python工程师标准>>> 1.2TCP/IP模型 第二节、OSI和TCP/IP网络模型 *本节要点&#xff1a; *了解OSI网络参考模型的产生背景和层次结构&#xff1b; *了解OSI和TCP/IP网络层次的对应关系及其工作原理 开放系统互连参考模型(OSI/RM) *为了实现不…

【SSB】使用命令行来检测Broker是否正常通信

在cmd命令提示符中输入以下命令进行检测ssbdiagnose CONFIGURATION FROM SERVICE T1ToT2_SenderService -S 192.168.0.110 -U sa -p 123456 -d T1DB TO SERVICE T1ToT2_ReceiverService -S 192.168.0.111 -U sa -p 123456 -d T2DB ON CONTRACT T1ToT2_Contract

PE文件头

pe文件头查看器下载与原文地址&#xff1a; http://www.pc6.com/softview/SoftView_109840.html PE文件入门&#xff1a; PE文件总的来说是由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成。其实&#xff0c;如果在纯Windows环境下运行&#xff0c;DOS文件头、DOS加…

寒假开学第一天

伴随着短暂而又漫长的寒假的结束&#xff0c;我们迎来了寒假开始的第一天&#xff0c;在开学之际难免有点浮躁的&#xff0c;但是这都不是事啦&#xff0c;我要面对的还有很多很多了&#xff0c;所以我要尽可能早得将心态给调整过来&#xff0c;重新回到正途中&#xff0c;绝对…

微信小程序+生命周期回调函数

在微信小程序的.js文件用于编写页面逻辑 Page()函数用来注册一个页面&#xff0c;该函数的参数是一个对象 通过该对象可以指定页面的初始数据&#xff0c;生命周期回调函数、页面事件处理函数等 1、js文件所有的函数写在Page里面 Page({ }) 2、页面的初始数据data Page({ ​ da…

Linux中fork()函数的底层实现【转】

转自&#xff1a;http://blog.csdn.net/duoru_xiong/article/details/76358812 1. fork()&#xff0c;vfork()&#xff0c;clone()的区别 这三个系统调用的底层都是通过do_fork()内核函数实现&#xff0c;只不过是通过对do_fork()传递的不同参数来实现不同的功能。其中参数clon…

Ubuntu10下安装JAVA JDK

一、背景 Amoeba for MySQL需要在Java SE 1.5和Java SE 1.6上运行&#xff0c;一开始我按照Amoeba for MySQL学习研究之安装的方法在Java SE Development Kit 6 Update 31下载了jdk-6u31-linux-i586-rpm.bin&#xff0c;安装到Ubuntu的时候出错了&#xff0c;后来才发现是我下载…

Git如何在Github和码云上的使用

Git 全局通用设置 git init //初始化本地git仓库 rm -rf .git //删除已存在的本地git仓库 git config --global user.name "自定义用户名" //标记你的名字 git config --global user.email "注册绑定用的邮箱" //标记你的邮箱 git add . //提交文件夹里的…

mybatis结果的组装(springboot)

文主要解答一个问题&#xff0c;即如果bean没有setter&#xff0c;而且属性不是public的&#xff0c;mybatis的自动组装是否可以赋值成功的问题。 查询调用过程 DefaultSqlSession.selectList -->SimpleExecutor.doQuery --> SimpleStatementHandler.query --> Defaul…

双线NAT下 如何利用路由器实现基于端口的流控

需求: ISP2跑http 其他的跑ISP1 interface FastEthernet0/0 --------假设该端口为ISP 2接入端口 ip address 192.168.1.2 255.255.255.0 --------分配地址 ip nat outside --------指定为…
最新文章