最近项目组里有一个bug,虽然我们大家都没有因为他而享受到“深夜静静改bug”的“乐趣”,但他也着实郁闷了我们一番。还好我们的Mr S同学已经将他拿下,在这篇blog,将记录下我看到这个bug时的思考:
bug描述:我们既存的一个连接池出现了泄漏问题。
bug原因:
我们有下面这么一个函数
void freeConnection(String type, ConnectionAdapter con);
因为我们有两个连接池,一个叫做Derby,一个叫做demo,使用一个字符串指明链接要网哪里还。然而问题来了,以前的一位同事,写下了下面这样的代码:
String dbConnType = "derby"
......
db.freeConnection("dbConnType", conn);
是的,因为根本不存在dbConnType这么一个连接池。所以运行一段时间之后,我们的的连接池里面没有了链接。
bug改修:
那么这个bug该怎么改呢? 拿掉那个变量的双引号?我想不是的。好的办法我认为有几个,最后一个是前面几个的递进,但他们思考的角度都是让接口更友善,让使用更方便:
1. 从freeConnection的角度思考,在freeConnection里面加卫语句。
既然我们能确定我们的代码中只有两个pool,那么当freeConnection在接受到"derby"和"demo"这两个参数以为的参数的时候,他就应该报告他的调用者,说:“嗨,你使用我使用错了。” 比如我们可以抛出一个IllegalArgumentException。
2. 从freeConnection的调用者的角度思考。改变freeConnection的调用参数。
这个问题的一个很隐晦的地方在于,使用了字符串来标识,我们要释放拿个池的链接。而程序中又充值着这样的使用方法。
db.freeConnection("derby", conn); //想加引号,因为想直接释放derby这个池
db.freeConnection("dbConnType", conn); //不想加引号,无用了,但是编译器没有帮我们区分过来。
这两个用法本身就很容易混,那么从freeConnection函数的使用者看来,完全有理由呼吁一个更友善的接口,比如像下面这样
ConnectionManager{
...
public static final ConnectionPool DERBY_POOL = ...
public static final ConnectionPool DEMO_POOL = ...
...
}
void freeConnection( ConnectionPool pool , ConnectionAdapter con);
这样做的好处是,利用类型保证了参数不会被误传,但是这样做的同时也暴露了很多东西,引来了其他的一些不可取之处。比如带着一个没用的参数,还是一个链接池,在代码各处跑来跑去,这么麻烦我们当初还为什么要写ConnectionManager
3. 综上,所以有了方法三:freeConnection方法的接口其实根本就应该是这样的;
freeConnection(Connection conn);
是的,总之是用户传递错误了参数,那么与其像上面那样,帮助用户传递正确的参数,到不如压根就不要求用户传递这个参数。而且,既然你有意要做一个ConnectionManage,那么关于这个池那个池的,本身就应该封装在你的里面,Don't make user think了。
恩,事情说完了。<!----><!---->
<!---->保证质量是多方面的,不是很努力的测就可以解决的问题,先撇开测试调试的技巧之类,其势必也受质量等其他因素的制约。好的设计从哪里来呢?好的设计应该即是程序员推敲的结果,又是他们的直觉使然。
分享到:
相关推荐
逆向思维可以帮助开发者从不同的角度审视问题,寻找最佳解决方案。 **1.3.4 小内核,大外延,工程库思维** 采用小内核设计模式,核心功能保持简洁高效,而周边功能则通过外延方式实现。此外,构建通用的工程库有助...
pymysql提供了一个Python接口,可以方便地与MySQL数据库进行交互,它支持连接池管理、事务处理等功能,适合在Python应用程序中使用。 "建表"工作计划于8.28 - 8.28进行,但由于某些延迟,实际完成时间是9.3 - 9.3。...
汇丰银行-港股-澳门博彩业:修正略显过度,需要重新审视-67-32页.pdf
新能源汽车行业专题报告:从“平价逻辑”对动力电池行业的重新审视-0227-中信证券-25页.pdf
报告标题:“HSBC-美股投资策略-预测神话2.0:美国债券收益率——重新审视误解-2021.1.29-30页”揭示了关于美国债券收益率的一些常见误解,并对这些误解进行了深入分析。以下是报告中讨论的关键知识点: 1. 货币...
我们根据AMS-02和Fermi-LAT观测到的宇宙射线对简化的暗物质模型进行了分析。 我们假设费米子,标量或矢量暗物质粒子带有疏疏的spin-0介体,该介体仅通过标量和/或伪标量双线性耦合到标准模型夸克和暗物质。...
覆你的交易体系,从哲学角度审视交易策略是一种怎样的体验?.doc
以经营的理念管理财务从财务的角度审视经营.pdf
从利益关系视角审视国企改革-4页.pdf
从信息化角度审视现代教育技术的历史功能与作用.docx
虽然中国的住房公积金贷款不良率相对较低,但多角度的风险审视揭示了潜在的风险问题。文章作者汪涵和尹中立指出,不能仅依赖贷款逾期率这一单一指标来判断贷款质量,因为该指标在贷款市场快速增长时可能会低估风险。...
心理角度审视先进性人格论文.doc
瑞信-美股-贵金属市场-黄金行业整合的进一步审视-2019.1.23-22页.pdf
综上所述,测控软件架构设计不仅涉及从总体到分系统再到详细设计的多层次设计,还需要设计师具备良好的需求管理和变更处理能力。此外,文档管理和标准遵循也是保证设计质量的重要环节。在整个设计过程中,各个角色...
《设计中的设计》是原研哉所著的一部关于设计哲学和实践的书籍,作者通过自己的设计经验与思考,探讨了设计的本质和设计师的社会责任。本书不仅提供了对平面设计、空间设计与建筑设计的深刻洞察,还强调了设计与生活...
通过非对角Bethe ansatz方法研究了具有周期性和反周期性边界条件的spin 12 XYZ模型。 通过构造非均匀的T-Q关系,可以导出哈密顿方程和Bethe ansatz方程的精确光谱,这使我们能够以统一的方式同时处理偶数N(晶格位点...
7. PM/RD协同测试:产品经理(PM)和研发人员(RD)的参与可以帮助从需求和实现角度审视测试用例,确保测试覆盖了业务逻辑和代码实现的各个方面。 8. todo列表:在测试用例设计中,可以创建待办事项列表,记录未...
多角度审视希腊主权债务风险的成因毕业论文.doc