日期:2014-05-16 浏览次数:20506 次
public static Entity get(long id, boolean forUpdate) throws Exception { if (forUpdate) { while (locks.contains(id)) {} locks.add(id); } Entity entity = cache.get(id); return entity == null ? loadEntity(id) : entity; }首先,如果是以更新为目的获取数据,那么需要检查更新锁;然后尝试从cache中获取Entity;如果cache中没有数据,则从数据文件中读取。
private static Entity loadEntity(long id) throws Exception { Meta meta = Meta.get(id); Entity entity = meta.getEntity(); loadFields(entity, meta); entity.setId(id); cache.add(entity); return FieldUtil.clone(entity); }先获取Entity的meta(这些meta以HashMap的形式加载到内存),然后创建Entity加载Entity的属性值,设置Entity的id,保存到cache中,clone一份后返回。之所以要进行clone,是为了保证不同的处理过程中对Entity的修改互不影响。
private static void loadFields(Entity entity, Meta meta) throws Exception { long position = meta.getPosition(); int size = meta.getSize(); String content = FileUtil.read(DATA_FILE, position, size); parseFields(entity, content); }获取数据所在的位置和size,从data文件中读取存储的数据的内容,然后进行解析并为Entity的属性赋值。parseFields(...)是FieldUtil中的一个方法,是通过import static方法导入的。
public static synchronized void save(Entity entity) throws Exception { File dataFile = new File(DATA_FILE); long position = dataFile.length(); saveData(entity); int size = (int) (dataFile.length() - position); Meta.saveMeta(entity, position, size); cache.add(entity); }这个方法是synchronized的,因此同时更新多个对象并保存时需要等待。逻辑是将Entity以一定的规则序列化后保存到data文件中,同时把起始位置和长度保存在meta中,并将entity放入cache。
public static synchronized void delete(long id) throws Exception { Meta.delete(id); cache.delete(id); }该方法也是synchronized的。仅需要id作为参数,向meta中写入一个删除记录,并从cache中将该Entity移除。
public static interface Getable { public Object get(Field f) throws Exception; } public static interface Operator { public void operate(Field f) throws Exception; }接口Getable用于封装获取Field值的方法,Operator用于封装对Field进行操作的方法。
public static void eachField(Class<?> clz, Class<?> upper, Operator operator) throws Exception { do { for (Field f : clz.getDeclaredFields()) { f.setAccessible(true); operator.operate(f); } clz = clz.getSuperclass(); } while (!clz.equals(upper)); }该方法将遍历指定的clz的所有属性,并递归遍历父类属性,直到指定的“上界”为止;遍历的过程中,可以对每个属性进行操作;操作的过程以接口Operator进行封装。