编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸
来源:互联网 发布:破解空间相册软件 编辑:程序博客网 时间:2024/04/30 11:51
关于连接池大家常常用的代码:(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的时候,从来没有申请链接,归还连接这个动作,而是从来就是使用就够了。
- 编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸
- 关于做框架页作业时归还单中“创建人”显示不出来的问题
- 编码素养问题收集1:基于名称映射的单例模式的并发控制
- 编码素养问题收集4:MySQL数据导入导出如何证明结果是正确的?
- 编码素养问题收集3:TeamLeader应该“有教无类”
- 编码不统一问题
- DBCP的数据库连接归还--利用 编程式AOP实现(不推荐)
- 中国电信,你为何不提高上门服务人员的专业素养?
- 《程序员的职业素养》中说“不”和说“是”
- iss连接不上的问题
- J-LINK连接不上的问题
- svn连接不上的问题
- MySql远程连接不上的问题
- android 模拟器连接不上的问题
- MySql连接不上的问题
- nat connect连接不上的问题
- adb 连接不上的问题
- PHP连接不上PostgreSQL的问题
- JavaFX之TableView的使用
- Oracle Process Architecture - Oracle 进程结构篇4
- Nutch1.7学习使用一些错误记录--持续记录
- NET-SNMP基本命令
- uboot传给linux的启动参数
- 编码素养问题收集2:连接不归还池,不学TemplateCallback惹的祸
- excel数据导入内表示例 .
- AS技术日志
- java随机函数
- Java之数据结构基础、线性表、栈和队列、数组和字符串,树—学习笔记
- UVALive 3220Heapsort 构造题
- Choose path to download file .
- 小作坊式项目开发(二)
- 面试数据结构篇—单链表常考点汇总