Java中將請求資料存入本地快取
最近做專案的時候,碰到這樣的需求,由於一些頁面的ajax請求資料太多,而且sql效率很低,導致壓力測試時一個頁面開啟需要一分多鐘,所以就想到如下幾種解決方案:
1.將請求的資料,通過IO寫入硬碟快取檔案,當發現有對應檔案時,便從該檔案讀取儲存的請求資料;
2.寫一個工具類,在工具類定義一個map型別的成員變數,將請求資料儲存到該map中;
3.修改資料庫伺服器的配置(當然這不是本文要討論的內容)
既然有了方案,就開始實現,頁面中有很多這樣的action:
@Action("test")
public void test(){
writeJson(testService.getTestData());
}
基本都是通過service中的方法返回list(map(String,Object)) 型別的資料,然後通過writeJson返回json到前臺
方案一:
//請求快取資料方法
public void requestData(String requestName){
try {
//建立File物件,引數為String型別,表示目錄名
File myFilePath = new File("D:\\cache");
//先建立父路徑再建立檔案
File myFile = new File("D:\\cache\\" +requestName+".json");
//如果父路徑存在
if(myFilePath.exists()){
//如果檔案存在
if(myFile.exists()){
//檔案最後修改時間
Date date = new Date(myFile.lastModified());
//當前日期
Date today = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
String lastModifiedDateStr = sdf.format(date);
String todayStr = sdf.format(today);
//如果最後修改時間小於當前日期
if(lastModifiedDateStr.compareTo(todayStr)<0){
//將當前檔案刪除
myFile.delete();
//建立新的快取檔案
createFile(myFile,requestName);
//如果最後修改時間大於或等於當前日期,則從該檔案讀取快取內容
}else{
// 讀取檔案內容 (輸入流)
StringBuffer sb=new StringBuffer();
String tempstr=null;
FileInputStream fis=new FileInputStream(myFile);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
while((tempstr=br.readLine())!=null){
sb.append(tempstr);
}
Gson gson = new Gson();
//使用gson獲取檔案中儲存的List<Map<String, Object>>結構的資料
List<Map<String, Object>> list = gson.fromJson(sb.toString(), new TypeToken<List<Map<String, Object>>>(){}.getType());
writeJson(list);
br.close();
fis.close();
}
}else{
//建立新的快取檔案
createFile(myFile,requestName);
}
}else{
//建立目錄
myFilePath.mkdir();
//建立新的快取檔案
createFile(myFile,requestName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//建立檔案方法
public void createFile(File file,String requestName){
try{
file.createNewFile();
//下面把資料寫入建立的檔案,首先新建檔名為引數建立FileWriter物件
FileWriter resultFile = new FileWriter(file);
//把該物件包裝進PrinterWriter物件
PrintWriter myNewFile = new PrintWriter(resultFile);
//使用反射獲取service中對應的方法
Method method = mHService.getClass().getDeclaredMethod(requestName, new Class[]{});
//動態執行該service的方法
Object result = method.invoke(this.mHService);
//將資料寫到前臺
writeJson(result);
//再通過PrinterWriter物件的println()方法把字串資料寫入新建檔案
myNewFile.println(JsonUtils.toJson(result));
myNewFile.close();
resultFile.close();
}catch(Exception e){
e.printStackTrace();
}
}
方案一有很不好的地方,會產生快取檔案,讀寫受到硬碟讀寫速度限制等
方案二:
//首先在類中定義map成員儲存快取資料
public static Map<String,Object> cacheData = new HashMap<>();
//通過service和對應方法名來獲取快取資料
public static Object getCacheData(String methodName,Object service,Object... params){
try{
Method method = service.getClass().getDeclaredMethod(methodName);
String key = method.getName();
Object[] objs = null;
//獲取可變長引數
if(params.length > 0){
objs = new Object[params.length];
int i = 0;
for(Object p : params){
objs[i++] = p;
key += "_" + JsonUtils.toJson(p);
}
}
//如果快取中有該請求的快取資料
if(cacheData.containsKey(key)){
System.out.println("read cache!");
//獲取對應快取資料
return cacheData.get(key);
}else{
Object result = null;
try{
//有引數
if(objs != null){
//動態執行該方法,請求資料
result = method.invoke(service,objs);
}else{
//動態執行該方法,請求資料
result = method.invoke(service);
}
System.out.println("read db!");
//將請求的資料存入靜態成員,變成快取
cacheData.put(key, result);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}catch(Exception e){
return null;
}
}
如有不妥和錯誤之處請各位評論指出。
相關推薦
Java中將請求資料存入本地快取
最近做專案的時候,碰到這樣的需求,由於一些頁面的ajax請求資料太多,而且sql效率很低,導致壓力測試時一個頁面開啟需要一分多鐘,所以就想到如下幾種解決方案: 1.將請求的資料,通過IO寫入硬碟快取檔案,當發現有對應檔案時,便從該檔案讀取儲存的請求資料;
Java 驗證請求資料完整性資訊
CreditAntifraudReq 請求接收實體類 package com.frms.exchange.command; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; im
java怎樣將資料儲存到快取中,之後再儲存
package com.henry; import java.util.HashMap; import java.util.Map; import java.util.Random; import ja
World Wind Java開發之八——載入本地快取檔案構建大範圍三維場景
/** * @Copyright 2014-2020 @奔跑的雞絲 **/ package edu.whu.vge.util; import edu.whu.vge.util.JavaCheckBoxTree.CheckBoxTreeNode; import gov.nasa.worldwind.Fa
【iOS】通過NSURLProtocol實現網頁載入本地快取資料
一.專案需求 專案中有個海報生成功能,使用UIWebView載入一些網頁,因為海報使用率比較高,有時載入網頁比較慢會影響使用者體驗,因此我們在APP啟動後,將一些固定資源,如css、圖片等,先快取到本地。載入網頁時,通過NSURLProtocol,優先使用本地的檔案,以加快網頁載入速
解決get請求java後臺接收資料亂碼問題
問題原因:從前端獲取引數出現了亂碼,通過debug可以看到xmmc為亂碼狀態。 解決辦法使用編碼解決 直接上程式碼 前端 使用encodeURICompomnent進行編碼 var xmmc = $('#s_xmmc').val(); xmmc=encodeURI
應用Java反射技術將Excel文件的資料存入對應MySQL資料庫
最近在做專案的時候遇到這樣一個需求:客戶給了一堆Excel資料文件,是從系統中匯出的,我們需要按資料的格式建立資料庫,讀取這些文件,並存入資料庫。 資料庫採用MySQL,開發框架採用Spr
android快取框架ASimpleCache的使用 (網路請求資料並快取)
官方簡介: ASimpleCache 是一個為Android制定的 輕量級的 開源快取框架。輕量到只有一個java檔案(由十幾個類精簡而來)。 框架地址 1、它可以快取什麼東西? 普通的字串、JsonObject、JsonArray、Bitmap、Drawable、
Java ConcurrentHashmap實現Localcache本地快取
很多場景下,有些請求的資料,是不會經常改變的,這種時候,為了減少資料庫的查詢壓力,可以將這一部分資料放入快取中,直接從快取中讀取。除了一些像Redis等快取外,還可以通過本地記憶體,作為快取。下邊將使用ConcurrentHashMap來實現本地快取。 >相關的技術:
Java中將鍵盤輸入的一段字元存入char陣列中
import java.util.*; public class Test { public static void main(String[] args) { char[] a=new char[100]; String str; System.o
Android之SQLite本地快取資料
一、在android中資料本地儲存分為SQLite資料儲存,Sharedprferences資料的儲存,File儲存,ContentProvider、還有一種為網路(Network) 1、在這裡主要就說明SQLite資料的儲存, SQLite是輕量級嵌入式資料庫引擎,它支援
Java post請求傳送json資料在filter中解析方法
大家都知道Java的servlet分get和post請求方式,在servlet或者在集成了springMVC、Struts2的框架的情況下獲取請求的引數。那麼有時候我們需要在攔截其中獲取ServletRequest的引數就不那麼容易了。因為在ServletRequst中,如果是get請求我們可以通過reque
java中將資料匯出到Excel
//main方法 package com.example.demo.system.entity; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java
Android請求獲取Java後端資料,登入介面例子
最近做了個Android請求獲取Java後端資料的例子,簡單實現了一下。先上個登入介面圖: 主要實現:java後端的程式碼 + Android的程式碼1、java後端(1)、先創個User類import net.sf.json.JSONObject; public cla
Android(或者Java)通過HttpUrlConnection向SpringMVC請求資料(資料繫結)
問題描述 當我們使用SpringMVC作為服務端的框架時,有時不僅僅要應對web前端(jsp、javascript、Jquery等)的訪問請求,有時還可能需要響應Android和JavaSE(桌面應用)這些客戶端的請求,因此,除了web使用form表單
在java中將各種型別資料轉化為json和從json中取資料
首先,匯入以下jar包 下面是各種型別轉化為json和從json中取出資料的程式 package jsontest; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
java物件本地快取機制的實現
本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。 建立屬性: /** * 具體內容存放的地方 */ private ConcurrentHashMap<String, Object>
Java自動過期本地快取簡單實現
實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能LocalCache.javainterface LocalCache { public void refresh()
java本地快取儲存cookieUtil工具類
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.
python3中將資料存入Mysql資料庫
近期自己練習爬取知乎評論資料,本來打算將資料存入ES,但是因為ES我之前也從來沒有接觸過,所以決定現將資料存入到Mysql資料庫中,網上有很多帖子,但是很多都是適用於python2.x版本,python3中沒有mysqldb,需要使用pymysql,使用如下語句來連結資料