编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸

原创 2013年12月05日 17:02:22

关于连接池大家常常用的代码:(1)从池中申请链接;(2)使用链接;(3)归还连接。以Jedis操作Redis为例:

ShardedJedis jedis = RedisUtil.getMyShardedJedisPool().getResource();
try {
       jedis.hmset(XXX)//其他N多地方出现jedis.get()或者set等操作
} finally {
       if (jedis != null) {
            RedisUtil.getMyShardedJedisPool().returnResource(jedis);
        }
 }


如果上述代码在整个工程中只出现1次,那没问题;如果上述代码在工程中出现N次,这代码素养就有问题。你没法保证每个程序员都会归还池,更不能保证每个程序员都会在finally里面归还池。程序的设计者应该去保证程序的使用者不那么容易犯错误才对。

重新设计:

public static <T> T execute(RedisCallback<T> redisCallback) {
	    //TemplateCallback Pattern (Genericity Supported Callback)
        ShardedJedis jedis = RedisUtil.getMyShardedJedisPool().getResource();
        try {
            return redisCallback.doCmd(jedis);
        } finally {
            if (jedis != null) {
                RedisUtil.getMyShardedJedisPool().returnResource(jedis);
            }
        }
    }


使用样例:

/* 写入redis */
        RedisUtil.execute(new RedisCallback<String>() {
            @Override
            public String doCmd(ShardedJedis jedis) {
                return jedis.hmset(cookieId, valueMap);
            }
        });


 这个思维过程是怎么样的? 先看段简单代码:

System.out.println("张三,您好,欢迎加入XX大家庭。");
System.out.println("李四,您好,欢迎加入XX大家庭。");
System.out.println("王五,您好,欢迎加入XX大家庭。");


很快大家发现打印的信息很多是冗余的,三个语句只有名字不同,大家马上会抽象出用一个输入参数来存储名称,于是:

sayHi("张三");
sayHi("李四");
sayHi("王五");

private static void sayHi(String name) {
         System.out.println(name+",您好,欢迎加入XX大家庭。");
     }

同样的道理,当我们发现(1)从池中申请链接;(2)使用链接;(3)归还连接 类似的代码使用N遍的时候,其中只有第2步不同,我们就需要消除冗余代码。问题的关键在于第2部不是个简单变量,因为它可能是jedis.hget(),也可能是jedis.hmset(),又或者是jedis.get() 变化的不仅是jedis实例对象,而且还有方法也在变。我们可以理解把一份数据(一个变量)传递来传递去,但是很难想象把一个行为,一个动作传递来传递去。实际上这个想法早就有了,C里面的“函数指针”就是让一个行为传递来传递去的。但JAVA里面没有函数指针,为什么?因为JAVA是面向对象的,对象本身就是数据+行为的结合体。所以jedis.hget(),也可能是jedis.hmset(),又或者是jedis.get()  可以整体抽象为一个“对象”,但是这个对象更多关心的是“函数传递”,这就是为什么JAVA里面会有“匿名内部类”这种东东(等效函数指针)。最后,Spring的JdbcTemplate也是这种机制,大家用jdbc的时候,从来没有申请链接,归还连接这个动作,而是从来就是使用就够了。






 

window自动升级惹的祸

我刚刚装的是winxpsp1(9394)英文版,本想升级打补丁,无奈遇到如下情况。1,首先在在系统盘c盘中发现多了五个文件:sex.bat,sex.html,sex.REG,xfks.exe,auto...
  • ijake
  • ijake
  • 2004年09月06日 05:00
  • 1144

都是‘/’惹的祸

昨天ninja911给我留言说用我去年上传的ARF解包器提取《疯狂牧场》的资源出现软件卡死、CPU占用100%的现象。今天查了一下,发现是/捣的鬼。因为向TreeView添加节点的时候我只根据/分析目...
  • leexuany
  • leexuany
  • 2009年09月30日 16:09
  • 2396

又是编码惹的祸

 昨天。害得我查错查了一天。都没有发现问题所在。因为浏览器没有报错。我就想程序本身应该没有问题。那就是注释的问题了。以下代码居然不能正确显示。如果我将页面属性改为gb2312.就可以正常显示。原页面为...
  • doncuy
  • doncuy
  • 2007年06月08日 10:13
  • 270

程序员日常编码的基本素养

本文是在阅读完《代码整洁之道》第四章之后的一些总结,其中也引用了部分原文。我是一名大三学生,读完该书的这一章后感觉即对书中描述的部分情形深有体会,又对自己将来的职业发展很有帮助。 自己的职业道路...
  • aerf5sd
  • aerf5sd
  • 2017年03月27日 17:38
  • 568

都是编码惹的祸---java编程

    最近在用润乾在做一些web项目的报表,其中有一个批量打印的报表。需要把参数传到报表里,当把中文传到里面时总时乱码,采用了各种转码方式,也没转过来,晕......... 为什么会有这么多的编码,...
  • wfg114
  • wfg114
  • 2010年01月15日 14:59
  • 132

超级旋风惹的祸

前天为了转移文件,用了腾讯邮件的文件中转站功能,没想到惹来一堆麻烦。先是文件下载有问题,老是找不到资源,没办法试了腾讯推荐的超级旋风下载,还真行了(真怀疑这个是不是故意的)。可更大的麻烦来了,第二天调...
  • jmhua2007
  • jmhua2007
  • 2008年04月21日 18:41
  • 286

chkconfig惹的祸

今天一个的bug,浪费了我几个小时。原因是我对命令用法理解不够透彻,不能一眼找到问题所在。 在linux下,做过程序随系统自启动的一定都用过chkconfig命令。 一下是分享时间: 1、场景 ...
  • guyuezhiguang
  • guyuezhiguang
  • 2013年06月20日 22:41
  • 465

WaitForSingleObject惹的祸

        前几天, 师弟的程序遇到了一个问题: 在窗口线程里可以改变ProcessCtrl控件的状态, 但把这段代码放在线程里就无法改变ProcessCtrl控件的状态, 其实是线程执行到这段代...
  • riag
  • riag
  • 2006年11月05日 20:49
  • 2591

复制粘贴惹的祸

asp=>txttxt=>asp不要以为这样是可以的. txt会少了一些格式.
  • yenange
  • yenange
  • 2011年07月15日 18:03
  • 372

初始化惹的祸

我们某种业务,客户端获取服务端数据,有重试机制。其中重试的timer原定是可配置的,就是服务端改了数值,客户端与服务端交互消息之后就起效。 客户端版本发布之后,发现客户端一直按默认值执行,更改tim...
  • yanghehong
  • yanghehong
  • 2011年09月26日 22:52
  • 1045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸
举报原因:
原因补充:

(最多只允许输入30个字)