網站后台數據庫被手動修改后前端頁面不更新的問題解決


問題描述:網站前端用vue,后端用java mvc+tomcat服務器,數據庫access。由於數據庫為共享文件,可能被通過前端網頁修改,也可能被手動修改,還可能被windows應用程序修改。通過前端網頁修改時,頁面可以正常顯示修改后的內容。而如果頁面查詢一次數據后,再通過手動或其他windows程序修改數據庫時,前端頁面不會顯示修改后的數據。

問題分析:經網上查詢大量資料,有人說是頁面緩存問題,但通過清除緩存、關閉頁面、更換瀏覽器等方法都無法解決該問題,甚至更換另一台電腦打開網頁也無法顯示修改后的數據。甚至有人說該問題無法解決,只能通過重啟tomcat服務器才行。重啟服務器后,的確可以顯示修改后的數據,但是作為服務器,怎么可以隨便重啟,數據隨時都有可能被其他人用windows程序修改,服務器管理人員也不知道何時有人修改了數據啊。最后查到一位大蝦說是服務器的緩存問題,分析得頭頭是道,然而卻沒有給出如何解決的方法。

問題的解決:通過上述大量資料查詢,確定是服務器的緩存問題,不是網頁緩存的問題,那么如何解決呢?我是通過將java mvc更改成spring boot框架來解決的,因為spring boot框架能非常方便快捷地進行服務器緩存管理,具體方法如下:

1、在pom.xml中添加ecache依賴,如下:

      <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

2、在resource文件夾下新建一個application.yml文件,寫下如下代碼(注意縮進):

spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:/ehcache.xml

3、在resources目錄下新建ehcache.xml,寫下如下代碼(里面的注釋已說明了各個代碼代表的意義),其中myCache是緩存的名稱,需要在后續的controller中用上:

<ehcache>
    <!--
        磁盤存儲:將緩存中暫時不使用的對象,轉移到硬盤,類似於Windows系統的虛擬內存
        path:指定在硬盤上存儲對象的路徑
        path可以配置的目錄有:
            user.home(用戶的家目錄)
            user.dir(用戶當前的工作目錄)
            java.io.tmpdir(默認的臨時目錄)
            ehcache.disk.store.dir(ehcache的配置目錄)
            絕對路徑(如:d:\\ehcache)
        查看路徑方法:String tmpDir = System.getProperty("java.io.tmpdir");
     -->
    <diskStore path="java.io.tmpdir" />
    <!--
        defaultCache:默認的緩存配置信息,如果不加特殊說明,則所有對象按照此配置項處理
        maxElementsInMemory:設置了緩存的上限,最多存儲多少個記錄對象
        eternal:代表對象是否永不過期 (指定true則下面兩項配置需為0無限期)
        timeToIdleSeconds:最大的發呆時間 /秒
        timeToLiveSeconds:最大的存活時間 /秒
        overflowToDisk:是否允許對象被寫入到磁盤
        說明:下列配置自緩存建立起120秒(2分鍾)有效 。
        在有效的120秒(2分鍾)內,如果連續60秒(1分鍾)未訪問緩存,則緩存失效。
        就算有訪問,也只會存活120秒。
     -->
    <defaultCache maxElementsInMemory="10000" eternal="false"
                  timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="true" />

    <cache name="myCache" maxElementsInMemory="10000" eternal="false"
                  timeToIdleSeconds="60" timeToLiveSeconds="120" overflowToDisk="true" />
</ehcache>

4、在controller中使用緩存,以下是示例代碼:

@Controller
public class Staff  {
    @Autowired StaffDao dao;
    @Cacheable(value="myCache")
    @RequestMapping(value = {"/AllStaff","/allstaff"})
    @ResponseBody
    public List<com.entity.Staff> findAll() {                
        List<com.entity.Staff> staff=null;
        try {
            staff=dao.getAllStaff();
        } catch (Exception e) {
            e.printStackTrace();
        }
        dao.closeConnection();
        return staff;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM