高效使用JavaEE ORM框架()
void update(User u) { // 从数据库读取User: User p = load(User.class, u.getId()); // 检查当前用户有无权限修改: // TODO: ... // 复制属性: p.setName(u.getName()); p.setAddress(u.getAddress()); // 不允许修改的属性例如email就不要复制了,然后更新: update(p);}?
Delete:对于Delete操作,ORM通常只关心映射到主键的ID属性,不过,正确的做法仍然是根据ID先通过ORM读取,然后判断权限,最后删除。简单的代码如下:
1.int id=12345;2.User u1 = load(User.class, id); // 从数据库读3.User u2 = load(User.class, id); // 从一级缓存读4.System.out.println(u1==u2); // True?实际上,很少有人会写出这样的代码,所以,一级缓存几乎没有什么作用。
而二级缓存就作用于整个应用。不过,当数据量很小的时候,通过增大数据库服务器的内存就和使用缓存没什么区别,当数据量非常大的时候,二级缓存的命中率很低,原因当然是缓存大小不够,因此,针对海量数据通常都要自己动手,用memcached做专门的缓存服务器来提高性能。所以,二级缓存不开也罢。
确定事务范围,小心使用Lasy Loading
使用ORM也需要对数据库事务有一定了解,通常ORM的一个会话对应一个数据库事务,如果事务持续时间长,占用的数据库资源就长,数据库并发处理能力就会降低,所以,事务范围越短越好。对于Web应用,把事务限制在Controller中就比限制在Controller+View中要短,通过MVC框架提供的各种拦截器可以很方便地开启和关闭事务。当事务限制在Controller时,到了View渲染的时候,就无法使用LasyLoading功能了。Lasy Loading虽然简单,但不当使用也会造成严重的性能问题,所以还是不用为妙。
以上对ORM框架的使用做了一个简单的概括,实际应用中还需要通过大量实践慢慢探索。