欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FreyjaJdbcTemplate 缓存失败了

程序员文章站 2022-03-07 15:20:45
...

事情不能总是一帆风顺,挣扎了一阵子我宣布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