解决页面ajax请求数据多及sql效率低致打开慢的几种实用解决方案
最近在做项目时遇到了这样的需求。一些页面的 ajax 请求数据量很大,并且 sql 效率很低,这使得在进行压力测试时,一个页面打开需要一分多钟。因此,想到了以下几种解决方案:

将请求的数据通过 IO 操作写入硬盘缓存文件。如果发现存在对应文件,就从该文件中读取存储的请求数据。
写一个工具类,在这个工具类里面定义一个成员变量,其类型为 map。然后把请求数据存储到这个 map 当中。
3.修改数据库服务器的配置(当然这不是本文要讨论的内容)
既然有了方案,就开始实现,页面中有很多这样的action:
@Action("test")
public void test(){
调用 testService 的 getTestData 方法并将其结果写入 Json 格式中。
}
大多是通过 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使用 sdf 对 date 进行格式化后,得到 lastModifiedDateStr 。
String todayStr = sdf.format(today);
//如果最后修改时间小于当前日期
iflastModifiedDateStr 与 todayStr 进行比较,比较的结果为 lastModifiedDateStr 与 todayStr 的比较结果。<0){
//将当前文件删除
myFile.delete();
//创建新的缓存文件
创建文件 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
List
方案一存在不良之处,会生成缓存文件,并且读写会受到硬盘读写速度的限制等。
方案二:
//首先在类中定义map成员存储缓存数据
public static Map cacheData = new HashMap<>();
//通过service和对应方法名来获取缓存数据
public static Object getCacheData使用字符串方法名、服务对象以及可变数量的对象参数(……)。params){
try{
通过 service 的类获取其声明的方法,该方法名为 methodName,然后将获取到的方法赋值给 method 变量。
获取方法的名称,将其赋值给字符串变量 key 。
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){
//动态执行该方法,请求数据
方法调用了 service,并传入了 objs,其结果为 result 。
}else{
//动态执行该方法,请求数据
调用 service 的 method 并获取结果,结果为 method.invoke(service) 所返回的值。
}
System.out.println("read db!");
//将请求的数据存入静态成员,变成缓存
cacheData.put(key, result);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}catch(Exception e){
return null;
}
}
如有不妥和错误之处请各位评论指出。