在用BoneCP的时候,发现一个JVM日志中报了一个异常,大意是“探测(detect)到有数据库链接没有关闭”(不得不说JVM的强大),但是我用的是连接池里面的链接啊,怎么会需要关闭呢?
有问题首先找官网。
于是我上官网又看了一遍Demo,但是只是一个简单的Demo,历史的BoneCP的sample的链接都没有了(Server Internal Exception)当时也没有多想,后文会有解释。根据Demo来看用完之后确实close了,而且fianlly里面连整个连接池都关闭了;所以讲他只是个Demo,只是描述了在使用一次情况下的处理。
官网解决不了google。
而且最好是中文搜索,BoneCP connection close;果然,第一个就是stackoverflow里面的人提问。点机一看,里面点赞最多的一个回答需要关闭,但是Connection的关闭并不会关闭物理连接,只是将链接还回了缓冲池,读到这里,我恍然大悟,一致看到Connection就以为是原生的Connection,看到close就以为是关闭物理连接。我想到了在debug代码的时候,缓冲池返回的connection其实是ConnectionHandle,当时心理曾经闪过一丝困惑,这里明白了,结果之前看到的源码Connection其实就是一个interface;但是你通过Driver获取的Connection则是一个代理,这个代理的close可是会真切的关闭链接。
看到网上的答案后,还要验证一下。
之前和汪洋有一个乌龙,我们讨论了一下Cloudera里面spark的agent的作用,我是一个论坛上看到过一个回帖,说是agent就是cloudera magager的一个埋点,用于监控服务;于是我坚持agent就是监测埋点;但是汪洋则说他们在实际部署的时候发现只有部署了spark agent才能够执行spark-submit;后来我问了一个cloudera内部人员,他的解释和汪洋是一样。
所以,网上获得答案后,一定要找别的渠道再验证一下。于是我看了一下BoneCP的源码,确实close函数里面没有半毛钱的关闭链接,只是修改了一些列的状态,应该就是在连接池中标记该链接是free的。
沟通,交流。
我觉这次调研还是有意义的,毕竟觉得看到close,到最后才发现其实close并不是想象的样子“你看到的,未必是你看到的样子”,我简单的描述了一下调研过程,发到了朋友圈。一个之前的同事回复了一句:为什么不用durid?其实Jeesite里面的缓冲池配置的就是Druid,当时没太在意;之前没用过。
这个朋友圈发出去之后,确实有收获,之前一直纠结要不要再朋友圈曝光,今天这番事件,应验了老罗曾经说的:一件事情说不好做还是不做,那就做,可能会有意外收获。
扩展,关于深度和广度
保持对技术的敏感度,其实那个同事建议后,我便尝试了解一下Druid以及BoneCP,看到了一篇很好的文章讲述这些缓冲池的历史,其中降到了BoneCP其实已经被作者放弃了,因为他又开发了一个更加高速的缓冲池。看到此处我不禁汗颜,因为官网已经去过,但是并没有注意这些事情,我再二次去网站的时候才看到他的最后一次更次年log是在2013年,去了github的挂网看到了下面的一段话:
BoneCP is a Java JDBC connection pool implementation that is tuned for high performance by minimizing lock contention to give greater throughput for your applications. It beats older connection pools such as C3P0 and DBCP but SHOULD NOW BE CONSIDERED DEPRECATED in favour of HikariCP
.我觉得研究一个技术除了技术本身,比如技术机制之外,如果是你关注的你还要关注几个维度,活跃度,受欢迎程度,代码质量。通过一些途径比如官网,github等来对于这个技术的周边进行了解。就像李红光关注操场草坪一样,因为这些都是会加深你对于这个产品的了解,就像搞对象要从各个渠道来了解一样;所以,研究技术就要想找媳妇一样。
上面说的是深度,再就是广度,当初看到了jeesite配置里面的Druid其实应该研究一下才对,这样将会对于你有更加宽泛的选择。

一个detect问题引发的一系列思考的更多相关文章

  1. 由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

    背景   我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的 ...

  2. @Autowired 引发的一系列思考

    关于Java注解 注解定义 标记注解 - 没有元素 @interface Marker { } 单元素注解 - 只有一个元素 @interface Single { String value() de ...

  3. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. Feign 400错误引发的一系列问题

    Feign 400错误引发的一系列问题 问题介绍 在使用Feign进行远程调用的时候出现非常奇怪的400错误,错误信息大概如下: feign.FeignException: status 400 re ...

  5. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

  6. 【深入浅出.Net IL】1.一个For循环引发的IL

    .Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 1.准 ...

  7. 在centos服务器上配置gitlab钩子引发的一系列问题

    为了给公司的服务器上搭建gitlab环境并且配置钩子(实现在本地git push之后服务器自动git pull),整了好久,最后终于把问题解决了,下面是记录安装gitlab之后引发的一系列问题: 首先 ...

  8. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...

  9. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

随机推荐

  1. 配置iptables实现本地端口转发的方法详解

    场景假如你在用 resin 调试一个 Web 程序,需要频繁地重启 resin.这个 Web 程序需要开在 80 端口上,而 Linux 限制 1024 以下的端口必须有 root 权限才能开启.但是 ...

  2. Linux统计文件数目

    统计当前目录下文件数目 $ find . -type f | wc -l 统计文件行数 $ wc -l filename 仅统计内容为pattern的行(只有pattern) $ grep -w &q ...

  3. python学习(一)——python与人工智能

    最近在朋友圈转起了一张图.抱着试一试的心态,我肝了些课程.都是与python相关的.     课程一:你不知道的python         讲师:王玉杰  (混沌巡洋舰联合创始人 & web ...

  4. jmeter-Foreach控制器与正则表达式

    使用正则表达式提取器匹配的id值有17个(参考上一篇) 如果我想对每个id值进行请求,这个时候就可以用到foreach控制器 添加 由于我正则表达式取值命名为orderid,这里就将orderid设置 ...

  5. MySQL安装详解图文版(V5.5 For Windows)

    MySQL在Windows中会得到越来越广泛的应用.故整理MySQL安装详解如下,以备不时之需.安装环境:Windows Server 2003 [32bit NTFS]版本信息:MySQL 5.5. ...

  6. Java多线程 - Callable和Future

    已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...

  7. UnsupportedOperationException

    java不支持该功能,多见于, Arrays.asList() ,然后使用remove和add方法.     因为asarraylist的集合是一个转化来的集合,它的大小是固定的.不能进行长度修改. ...

  8. IOS-KVO、KVC

    √  概述 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving 非正式协议的形式被定义为 ...

  9. 【sparkStreaming】将DStream保存在MySQL

    package SparkDemo import java.sql.{Connection, DriverManager, PreparedStatement} import org.apache.s ...

  10. opencv:摄像头和视频的读取

    示例代码: #include <opencv.hpp> using namespace cv; int main() { VideoCapture Capture(); //打开默认摄像头 ...