解决页面ajax请求数据多及sql效率低致打开慢的几种实用解决方案

最近在做项目时遇到了这样的需求。一些页面的 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>结构的数据
                       ListString, Object使用 gson 将 sb 的字符串形式转换为对象,转换后的结果存储在 list 中。new TypeTokenString, Object>>>(){}.getType());
                       writeJson(list);
                       br.close();
                       fis.close();
                   }
               }else{
                   //创建新的缓存文件
创建文件 myFile 并指定请求名称为 requestName 。
               }
           }else{
               //创建目录
               myFilePath.mkdir(); 
               //创建新的缓存文件
创建文件(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 打印出将 result 转换为 Json 格式后的结果。
           myNewFile.close();
           resultFile.close();
    }catch(Exception e){
            e.printStackTrace();
    }
}

方案一存在不良之处,会生成缓存文件,并且读写会受到硬盘读写速度的限制等。

方案二:

//首先在类中定义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;
    }
}

如有不妥和错误之处请各位评论指出。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读