FreyjaJdbcTemplate 缓存失败了
事情不能总是一帆风顺,挣扎了一阵子我宣布freyja缓存特性添加失败。
查询缓存本身就是一个很可笑的事情,缓存不是数据库。面对错中复杂的sql很难维护缓存,查询缓存还是需要根据业务来做,否则完全是浪费时间而且效率低下。
no update成了大话,sql的结构太复杂了。
原本想实现no update。就是update(Object)的时候什么都不去做。这么一来缓存中的值为最新。数据库中的值就和缓存中的不同步。
然后问题集中在查询上面:最终的结果集=数据库集+缓存集。而且因为数据库集部分结果需要与缓存中的结果同步。然后同步之后的最终结果才是正确的值。问题是sql实在是太复杂,校验缓存中的结果太难。当然如果是单表这种简单的查询还是可以做的。如果想实现no update。
就必须把sql拆分为单个的简单sql。其实这个是可行的。例如:
select u.* from user u left join hero h on u.uid = h.userId where u.name = '1' and h.level > 10
这个sql就应该拆为:
List = select * from hero where level > 10 一个结果集
for(Hero hero:list){
select * from user where name = '1' and userId = hero.userId
}
类似这样 复杂的sql结果变为了简单的结果。然后针对每段这种简单结果进行“最终的结果集=数据库集+缓存集。”这种合并,可见这样是多么的复杂。由这样的复杂计算带来的好处是no update值不值?
不过对于简单的查询缓存 如单表查询还是可以加一加的。
我了个去,这么一来好像和hibernate没有什么区别了。而且freyja还需要山寨一个hibernate的三态,不然在用到实体关联的时候要么update的时候效率低点,要么单独update。
难道优点只剩下HQl部分和缓存唯一2个方面了?
山寨三态刻不容缓,查询缓存再说。
其实我再想有没必要搞这种sql:
select * from Hero h left join UserInfo i on h.user.uid = i.user.uid where h.user.name = 'a' and h.level > 1