在用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. GRE/GMAT/LSAT长难句300例精讲精练-思维导图

    <GRE/GMAT/LSAT长难句300例精讲精练>是GRE超人气名师陈琦老师团队的又一本新作,也是“再要你命3000”的新成员,从之前的词汇.短语.练习,提升到长难句层面,相信学完本书后 ...

  2. [国家集训队2011]happiness

    Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友 ...

  3. 《Computational Statistics with Matlab》硬译

    第1章 从随机变量采样 研究者提出的概率模型对于分析方法来说通常比较复杂,研究者处理复杂概率模型时越来越依赖计算.数值方法,通过使用计算方法,研究者就不用对一些分析技术做一些不现实的假设(如正态性和独 ...

  4. BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】

    传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...

  5. [Hadoop] - Hadoop 3.x版本新特性

    仅做记录--->官方说明:http://hadoop.apache.org/docs/r3.0.0-alpha2/index.html ============================= ...

  6. yii2:多表查询

    啥都不说了,上代码: $list = static::find() ->leftJoin('book', 'book.RID = prices.RID')->select('prices. ...

  7. 使用MouseWithoutBordersSetup共享鼠标键盘教程

    1.下载MouseWithoutBordersSetup软件 2.需要共享鼠标键盘的电脑都要安装[注:这些电脑在同一个局域网] 3.运行软件后,图标上右键—>Settings 注意大红框的地方, ...

  8. is(':visible')

    .end()为结束前面处理函数,返回到最初的元素 .next()为此元素的下一个元素,可以再加上.next()表示下下一个元素,以此类推 :visible 选择器选取每个当前是可见的元素.语法:$(& ...

  9. 内存保护机制及绕过方案——利用未启用SafeSEH模块绕过SafeSEH

    前言:之前关于safeSEH保护机制的原理等信息,可在之前的博文(内存保护机制及绕过方案中查看). 利用未启用SafeSEH模块绕过SafeSEH ⑴.  原理分析: 一个不是仅包含中间语言(1L)且 ...

  10. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xiaozao_web]]

    二月 20, 2017 11:30:28 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...