問題描述:網站前端用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; } }