摘要 呵呵,久闻J2Cache的大名,呵呵今天有点时间看了下,介个就犹豫不决了,是踩呢还是不踩呢?踩了@红薯 会不会封我的号呀,呵呵,最后想半天,最帅的红薯心胸宽广得像大海一样,那还等啥,踩吧。 就是不知道红薯会不会给个置顶机会?不给置顶给个机械键盘也成
j2cache tiny tiny framework
目录[-]
总结一下:
附:Tiny成员会出现请客的情况:
槽点一:集成方式采用ANT
工程还是传统的工程,集成还在用的ant,当然ant来做没有什么不可以,但是作为OSC这么高大上的作者拿出的作品能不能槽点高一些?已经采用了Maven了,用Maven无法独立完成的意思么?
槽点二:提交内容的不审慎
居然把Eclipse的工程文件提交到配置库,难道不知道有N多种开发工具么?不知道Eclipse工程文件中有一些东西是与本机相关的么?这样冲突如何解决呢?难不成所有作者的工程环境全是一样的?
槽点三:文件治理不够严谨
在src/main/java中赫然有xml和properties文件存在,OMG,我们的节操还可以再低一点么?测试性的代码放在了main/java中。
槽点四:架构设计比较乱
在我看来,不管是ehcache或者redis都是缓存的一个扩展,但是这些东西都被结结实实的依赖在框架的main主干中,Hibernate只是应用缓冲的一种应用场景,但是也赫然在工程结构当中,如果把J2Cache的缓冲实现扩展N种,再把J2Cache的应用推广M种,我们就欣然看到在J2Cache当中信赖了n+m种的依赖包们,我们的使用者应该怎么办呢?要么忍受利用J2Cache时带来的N多用不着的包,要么就要辛苦的去强制不依赖这些包,而这都要拜J2Cache所赐。
槽点五:程序实现也有一些问题简单列列如下
在RedisCacheProvider这个实现类中,就有如下问题(当然,如果非说它不是个问题,我也没有办法):
private static String host; private static int port; private static int timeout; private static String password; private static int database;
这里声明了一堆的静态变量
结果这些变量都仅在start方法中一个里面有用到,那又变成静态变量是什么意思?
private static JedisPool pool;
这里定义了JedisPool是个静态变量,也就意味着只能有一个实例,也就意味着如果你要开两个独立的Redis缓冲是不可行的了,如果你想在一个工程里连接两个Redis服务器--OMG,你还是死了这条心吧,除非你重写这个类。
if(key instanceof Number) return region + ":I:" + key; else{ Class keyClass = key.getClass(); if(String.class.equals(keyClass) || StringBuffer.class.equals(keyClass) || StringBuilder.class.equals(keyClass)) return region + ":S:" + key; } return region + ":O:" + key;
这里不断的有字符串相“+”,而且还是连加........
public static void main(String[] args) { RedisCache cache = new RedisCache("User"); System.out.println(cache.getKeyName("Hello")); System.out.println(cache.getKeyName(2)); System.out.println(cache.getKeyName((byte)2)); System.out.println(cache.getKeyName(2L)); }
这里还有这个,还能再任性一点么?
public Object get(Object key) throws CacheException { Object obj = null; boolean broken = false; Jedis cache = RedisCacheProvider.getResource(); try { if (null == key) return null; byte[] b = cache.get(getKeyName(key).getBytes()); if(b != null) obj = SerializationUtils.deserialize(b); } catch (Exception e) { log.error("Error occured when get data from L2 cache", e); broken = true; if(e instanceof IOException || e instanceof NullPointerException) evict(key); } finally { RedisCacheProvider.returnResource(cache, broken); } return obj; } @Override public void put(Object key, Object value) throws CacheException { if (value == null) evict(key); else { boolean broken = false; Jedis cache = RedisCacheProvider.getResource(); try { cache.set(getKeyName(key).getBytes(), SerializationUtils.serialize(value)); } catch (Exception e) { broken = true; throw new CacheException(e); } finally { RedisCacheProvider.returnResource(cache, broken); } } }
这里是啥意思?当你拿到一个Cache对象,你每次添加或返回一个缓冲的值,用的居然不一定是一个Redis实例,好吧,我知道Redis的连接池还是比较快的?还是比较快就不花时间了么?
if (value == null) evict(key);
Ok,这里表示,如果设置的值是null,就把这个值干掉,
public void evict(List keys) throws CacheException { if(keys == null || keys.size() == 0) return ; boolean broken = false; Jedis cache = RedisCacheProvider.getResource(); try { String[] okeys = new String[keys.size()]; for(int i=0;i<okeys.length;i++){ okeys[i] = getKeyName(keys.get(i)); } cache.del(okeys); } catch (Exception e) { broken = true; throw new CacheException(e); } finally { RedisCacheProvider.returnResource(cache, broken); } }
但是关键是这个方法里面又去获得了一个新的Redis对象。
public EhCache buildCache(String name, boolean autoCreate, CacheExpiredListener listener) throws CacheException { EhCache ehcache = _CacheManager.get(name); if(ehcache == null && autoCreate){ try { synchronized(_CacheManager){ ehcache = _CacheManager.get(name); if(ehcache == null){ net.sf.ehcache.Cache cache = manager.getCache(name); if (cache == null) { log.warn("Could not find configuration [" + name + "]; using defaults."); manager.addCache(name); cache = manager.getCache(name); log.debug("started EHCache region: " + name); } ehcache = new EhCache(cache, listener); _CacheManager.put(name, ehcache); } } } catch (net.sf.ehcache.CacheException e) { throw new CacheException(e); } } return ehcache; }
这个方法写得实在是醉了,呵呵,太难看了。
这里关键在于:如果autoCreate是个false,你永远拿到的是null。那么问题来了,如果autoCreate只能是true,这个参数还有意义么?
再一个问题,如果返回一个null,让使用的同学们如何用?写成下面这个样子么??
if(xxx!=null){
doSomeThing....
}
忽然在net.oschina.j2cache中又发现一个类CacheTester.java
总结一下:
J2Cache比我想像中要小许多,简单易用,当然再注重一下细节就更好了。
附:Tiny成员会出现请客的情况:
System.out.print用在不应该出现的地方
不适当的使用main方法。
方法函数行数太长
圈复杂度太大--超过10
异常处理处理不好:应该有没有,不应该有有了,抓到异常没有说明也没有任何处理
造成Maven循环依赖了
已经测试完成的代码,出现导致整个系统崩溃的问题了
提交了编译通不过的代码到配置库的
提交了不应该提交的内容到配置库的
已修正Issue但是不在git上关闭的。
Sonar规则检查通过率85%以下的
悠然判定认为需要请客的
欢迎登录关注:http://bbs.tinygroup.org,本例涉及的代码和框架资料,将会在论坛分享。技术交流群:228977971,让我们一起动手,了解框架的奥秘!
相关推荐
在".NET 三层架构制作吐槽网"项目中,我们看到这个应用可能包含用户登录、内容查看、信息发布、评论互动以及点赞功能,这些都是社交媒体平台的基础元素。下面将详细讲解这些知识点。 首先,三层架构主要分为以下三...
一个留言类型的网站,适合新手。吐槽网站。特别适合新手进行学习。也可以直接使用。
基于PHP的消息果留言板(吐槽版) PHP源码.zip
工作中那些不得不吐槽的Chinglish
采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...
【无力吐槽】这一网络用语源自中文互联网,主要在年轻人和网络社交群体中流行。它表达了一种面对某种情况或言论时,感到无言以对、无法进行批评或反驳的状态,通常带有无奈、搞笑或者轻微的讽刺意味。当一个人说...
一个快速高效的端口扫描工具,制定IP段扫描端口,还可以对部分路由器读取路由器相关用户信息。支持路由器或服务器型号:XM-3300N- ASUS- D-Link- LevelOne- Netis- Pozitron- TP-LINK支持端口:8080,80,8888,8081...
web登录页面
这个压缩包文件“安卓直播视频播放流媒体IPCameraRTSPDLNA相关-android实现吐槽弹幕.rar”似乎包含了针对这些主题的一些源代码和资源,旨在帮助开发者了解和学习如何在Android应用中实现类似的功能。 首先,我们来...
技术栈:项目采用了SpringBoot + MybatisPlus + uniapp + uview2等技术栈,这表明它是一个现代的、面向全栈开发的项目,适合想要学习前后端分离架构的开发者。 功能模块: 小程序授权:用户通过授权登录,获取openid...
当你看到有趣的漫画、图片时,你是否想直接在图片上认为有趣的地方吐个槽,发表一下你的想法? 本扩展就是为此而做,赶紧安装,一泄你那满腔的吐槽热情吧! 除了漫画、图片,任何的网页都是可以使用此扩展进行吐槽...
该项目是一款基于Vue、JavaScript和HTML的企业黑红名单吐槽小程序设计源码,共包含54个文件,其中Vue文件23个,PNG图片15个,JS文件6个,JSON文件4个,Gitignore文件2个,LICENSE文件1个,Markdown文件1个,HTML文件...
本项目是一款基于Django框架开发的校园食堂菜评价与吐槽互动平台设计源码,包含201个文件,涵盖45个JavaScript文件、38个GIF动画文件、30个CSS样式文件、26个Python源代码文件、17个PNG图片文件、12个HTML文件、10个...
首先,我们来探讨一下“吐槽”的含义。在互联网文化中,“吐槽”通常是指对某一事物进行幽默或尖锐的批评,这种批评往往带有调侃和讽刺的成分。在本案例中,作者通过“十大最烂文案”这个主题,可能列举了支付宝软件...
Flex饼图向上吐槽是一个关于Adobe Flex中饼图组件的专题,这个组件被设计用来以图形化的方式展示数据,尤其适用于显示部分与整体的关系。在Flex中,饼图是一种常见的图表类型,它将数据集中的各个数据项以扇形区域...
supercache2 含注册机 巨好用的内存虚拟硬盘缓存软件,能大大减轻硬盘负担。 Supercache II这个软体最主要的功能就是帮硬碟做cache的动作,你可以把他想成是硬碟的快取, 目前市面上的硬碟快取主要为8MB,用这个...
直面吐槽 智能家居产品.pdf
2. **实现两路伪相联Cache:**根据指定配置,在模拟器上实现伪相联Cache,即每组有两个槽。 3. **比较不同Cache配置的性能:** - 运行一段程序,记录在伪相联Cache配置下的缓存失效情况。 - 将结果与直接映射Cache...