[java]内存缓存和weakreference

背景

  • Java中直接给变量赋值(原始类型和null除外)时是强引用
  • 假设简单的内存缓存使用ConcurrentHashMap

问题

虽然使用内存缓存可以方便的加速程序,但是存在不知道条目何时失效的问题。不管是放入时遍历还是去除时判断甚至守护线程,实际上都是在做类似GC的事情。

另一种方案

Java提供了java.lang.ref包,其中有weakreference等类。这些类提供了一种不用模仿GC但是可以提示GC的解决方案。
比如softreference,假如你在内存缓存中放置的是softreference的话,程序在内存不足的情况,会把一些softreference回收掉,这样的话,至少不会发生OutOfMemory的异常。
而weakreference,在GC执行时会被回收,如果对象比较复杂的话,GC多次执行后才会被回收。另外,有一个类叫做WeakHashMap,基于WeakReference,如果你愿意,你可以用WeakHashMap作为内存缓存的非线程安全的实现。
如果你对java.lang.ref包中其他的类有兴趣,建议阅读javadoc或者google一下相关文章。

建议

建议内存缓存至少使用softreference或者weakreference。
理论上WeakHashMap也可以用,但是就像HashMap并不是用来做缓存的一样,WeakHashMap并不是设计来作为缓存的。所以,最好多了解一些缓存实现并使用,比如jcache/ehcache/oscache etc。

[scala]50行实现web表单验证器

思路是这样,每个表单实现Validatable特质。这个特质要求实现返回一个属性名到验证器列表的映射。

表单验证器执行时首先获取表单所有的属性(除去class),然后遍历这个映射,运行字段对应的验证器变成响应的验证错误(如果有的话),否则最后是个空集合。

FormValidatorRunner(代码最下方)是测试类,执行结果是

Map(name -> List(ValidateError(default.notBlank,List())))

代码如下:

Read More

GetBeanProperties via Scala

一个简单的用Scala写的获取bean属性的例子。核心方法是Introspector#getBean(Class)

returnvalue & xwrapper

introduction

背景是WebService,具体实现是XFire。由于某种原因XFire的Fault无法使用,导致只能使用返回值表示成功与错误的情况。举例如下:

实际实现时,发现服务有很多方法,每个方法有各自的返回类型,有部分重复。其次是服务端每个方法都必须try catch,把错误转化为返回值。第三是客户端代码也有重复,每次都要检查是否为null和是否成功。
为了减少重复代码,提供如下方案:

Read More

compile install mysql 5.6.10 and optimize for low memory VPS on debian 6

compile

initialize database

Read More