在用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. Linux Shell脚本简介

    Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...

  2. ErrorHandling in asp.net web api

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling https://d ...

  3. Sqrt(X),求平方根,折半查找

    算法分析:利用折半查找,降低算法复杂度.前面求x得y次幂,也是将y/2,都是为了降低复杂度. //折半查找的思想 public class Sqrt { public int sqrt(int x) ...

  4. ASC和字符转化,整形和String转化

    public class ASCTest { public static void main(String[] args) { /* 区别这两种 String s = "123"; ...

  5. Bootstrap——优秀的开源前端框架

    Bootstrap是著名的社交网站.微博的先驱Twitter在2011年8月推出的开源WEB前端框架,集合CSS和HTML,使用了最新的浏览器技术,为快速WEB开发提供了一套前端工具包,包括布局.网格 ...

  6. Java多线程 - 线程同步

    多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...

  7. QSS设置字体不起作用

    正确的QSS QLabel{ font-family: "Microsoft YaHei"; font-weight:bold; font-size:14px; color: #3 ...

  8. pandas 数据处理

    1. 查看数值数据的整体分布情况 datafram.describe() 输出: agecount 1463.000000mean 22.948052std 8.385384min 13.000000 ...

  9. Java8_01_新特性概述

    一.前言 二.

  10. 广义线性模型(GLM)

    一.广义线性模型概念 在讨论广义线性模型之前,先回顾一下基本线性模型,也就是线性回归. 在线性回归模型中的假设中,有两点需要提出: (1)假设因变量服从高斯分布:$Y={{\theta }^{T}}x ...