编码素养问题收集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的时候,从来没有申请链接,归还连接这个动作,而是从来就是使用就够了。






 

相关文章推荐

编码素养问题收集1:基于名称映射的单例模式的并发控制

public class MemcachedClientFactory { private static final Logger LOG = LoggerFactory.getLogger(...

不学编程制作APP

  • 2016年06月22日 08:50
  • 211KB
  • 下载

我们为什么可以不学C++

  • 2010年02月23日 18:59
  • 178KB
  • 下载

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

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

黑马程序员:Python时代已到来!此时不学更待何时?

一、     人生苦短,我用Python!   程序员的江湖中一直流传着这样一句话“人生苦短,我用Python!”别看它是中文的,它已经火遍全球了!请看下图:   那个穿着印有中文黑色T恤的外国程序...

亚洲销售女神徐鹤宁经典语录——太过精辟,不学必悔

1,人生最重要的不是努力,不是奋斗,而是抉择。 2,老板只能给一个位置,不能给一个未来。舞台再大,人走茶凉。 3,意外和明天不知道哪个先来。没有危机是最大的危机,满足现状是最大的陷阱。...

Twitter为什么不学Google+或Facebook采用实名制

在强烈的反对声中,Google还是坚持要求用户在Google+上用实名制,就算貌似实名也可以,Facebook亦是如此,过去我们对此事很反感,很难想起曾经有一个多么大又不需你真名的网站了。实名制使我们...

在不学成风的大学里顶风而上 .

http://bbs.xwh.cn/thread-8240356-1-1.html http://bbs.xwh.cn/thread-8240381-1-1.html http://bbs.xwh...

Cortex-A8初学必备!不学A8你OUT啦

  • 2013年06月19日 13:32
  • 5.79MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸
举报原因:
原因补充:

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