关于mysql视图无法同步刷新的解决办法

        在最开始构建项目时,用到视图是因为有一个查询的功能,是需要查询多张表关联显示数据的。 用视图就可以避免在mybatis中写复杂的查询语句,直接根据视图构建实体对象。

       真正发现问题的时候,是在项目建完开始测试使用时,发现视图中的内容一直保持不变,在多方查找资料的情况下,才了解到视图因为是虚拟的,其查询是基于缓存查询,因此当视图查询的缓存存在时,就会一直使用其缓存,那么页面显示的查询内容还有什么意义呢,没有进行实时更新。当时钻到这个问题中去了,想了诸多解决的办法:

     1、根源解决,清除缓存。(从这一方面考虑,我就一直致力于清除缓存的思路中:获取reload权限,用flush更新缓存,最终失败)

    2、触发器,用触发器去变更视图中的内容(其实这个也是最初想的内容,视图为什么不根据表的内容更新,原因:其为不可更新视图。经反复尝试,即使用触发器也无法更新)

    3、将视图中的字段换为真实表字段(首先在已有的真实表结构中添加字段,之后将需要通过groupby 语句的信息通过触发器变更到真实表中:由于(更换手机号)业务中的一项操作是将原有手机号对应的用户名清空回库,将库存手机号的用户名(库存手机号用户名为空)更改为现有用户,这样以来,触发器如果绑定在手机号信息表中的话,会被触发2次,对应2个update。通过触发器中的new,和old进行变更时,最终获取的是第二次update操作触发器中保存的new和old的内容,而回库的手机号是无法通过new 和old获取的。不过因为不管是回库还是新分配的手机其用户是同一个人,因此根据after  更新之后触发器获取的new中的用户名,就可以将其对应的手机号变更为新记录的手机号),此方法可行,只是需要增加原有表结构的字段,前期的数据也要重新填补,因此比较繁琐,如果涉及大量表更新,都要对各个变更表新建触发器。

    4、想方设法更改不可更新视图为可更新视图(1、去掉聚合函数2、去掉union\groupby\having等3、去掉子查询),但是这样我就查不出正确数据了,所以不可行。

       为了快速解决这个更新问题又不用变更表结构,最终我的解决办法是:改变mapping文件中的利用视图查询方式,抛弃使用视图查询,将简单的虚拟视图查询语句改为多个真实表关联查询。将视图中的复杂查询语句粘贴到mapping中,重启tomcat,完美!!!该变得都变了。这件事告诉我,有时候想的多未必是好的,想到点子上才对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值