關於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,完美!!!該變得都變了。這件事告訴我,有時候想的多未必是好的,想到點子上纔對。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章