课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java培训:Servlet数据缓存
  • java培训:Servlet数据缓存

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-07

  • 昆明Java培训的老师知道,缓存是提高数据访问能力,降低服务器压力的一种必要的方式,今天昆明Java培训的老师要说的数据缓存方式有两种,1-->session对单个数据访问接口页面的数据进行缓存,2-->单例模式对整个servlet页面一个公用的数据缓存。3-->cookie本地缓存

    一、什么是缓存

    什么是缓存,为了让看者更好的理解,我这里就用自己的理解来举例说明,例如当前我们正在做一个商城类的app,app首页要加载显示很多商品,数据量比较大,像这样的数据接口最适合给其加一个缓存了,因为这样的数据接口反馈的数据都是公用的(所有人都是用它,不会根据不同用户判断,加载不同的数据)。在我们没有增加缓存之前,每当用户在app上点击对应的调用接口页面之后,servlet都会去访问数据库,从数据库中取得数据。但是当我们加了缓存后,只要有一个用户访问了这个接口数据库之后,我们就会将这份数据保存到缓存中,那么下次只要有用户调用该接口,servlet就会从缓存中读取保存的数据,然后反馈给用户。

    二、session

    session对点缓存,它保存的缓存,无法在其他页面进行访问,数据保存在服务器内存中,下面我来代码。              

    1 //查询出游戏表当前所有数据

    2        else if(Type.equals("3"))

    3        {

    4            

    5             

    6              HttpSession session = request.getSession();

    7              //判断session中allGamesDataList的值是否为空,由于下面的代码对session设置了过期时间,所以只要过期了,servlet

    8              //这个值也会自动设置为空

    9              if (session.getAttribute("allGamesDataList") != null) { 

    10                  

    11                  returnJsonObject=(JSONObject) session.getAttribute("allGamesDataList");

    12                   response.getWriter().println(returnJsonObject.toString());

    13                   return;

    14              } else{ 

    15                  

    16                  

    17              

    18              }

    19         

    20             mysqlParameter=new String[]{"account"};

    23           returnData=MySqlHepler.executeQueryT("select __ from __ where __!=?", mysqlParameter);

    24                      

    25            try {

    26                   returnJsonObject =new JSONObject();

    27                   returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData);

    28                    returnJsonObject.put("Rows", returnJsonArray);

    31                   returnJsonObject.put("GetType", "0");

    32                   returnJsonObject.put("Success", "1");

    33                    //缓存5分钟过期,5分钟内有人调用该接口,会直接从缓存中获得数据,5分钟后必须再访问一次数据库获得数据并保存到缓存中

    37                   session.setMaxInactiveInterval(5 * 60);

    38                   session.setAttribute("allGamesDataList", returnJsonObject);

    39                  response.getWriter().println(returnJsonObject.toString());

    40                  

    41            } catch (SQLException | JSONException e1) {

    42                 

    43                

    44                e1.printStackTrace();

    45            }

    46            

    47        }

    二、单例模式

    这里昆明Java培训的老师用单例来做缓存,是因为session保存的缓存无法跨页访问,所以就想到了单例,当然肯定还有其它更好的方法。我这里使用单例保存的是用户的token,当用户登录时生成的一个随机token反馈给用户,然后已用户的登录id为key,将toke保存在servlet的单例中,这里将token保存到缓存中,是因为token在所有的数据加密验证页面中都会使用到,如果不保存那么所有加密接口请求时都会去数据库中查询一次token,这样肯定就影响效率了,遇到这样的数据,也必须做缓存的。

    单例代码

    1 package Helper;

    2 import org.json.JSONObject;

    3 public class ShareSingleton    

    4 {    

    5  public    JSONObject UsrTokenDictionary;

    6  public  static ShareSingleton instance=null;

    7  public static     ShareSingleton getInstance(){    

    8        if(instance == null){ 

    9            instance = new ShareSingleton(); 

    10              instance.UsrTokenDictionary=new JSONObject();

    11             return instance;

    12            

    13        }else{    

    14            return instance;    

    15        }    

    16    }   

    17   

    18  public void VerifyTokenForInterface(String RequestToken)

    19  {

    20      

    21     

    22  }

    23 }  

    保存token到单例中

    1    //使用uuid生成用户唯一token

    2                 ecryptToKenUUID = UUID.randomUUID().toString();

    3                  mysqlParameter=new String[]{ecryptToKenUUID,LoginId};

    4                if(   MySqlHepler.executeUpdate("update _ set _=? where _=?", mysqlParameter)>0)

    5                {

    6                     

    7                        UserInfoObject =array.getJSONObject(0);

    8                       UserInfoObject.put("encryptToken",ecryptToKenUUID);

    9                       /*AddicationDictionary:这里的取值:为用户需要保存到app defaultusr里面的*/

    10                       returnJsonObject.put("AddicationDictionary", UserInfoObject);

    11                       returnJsonObject.put("GetType", "1");

    12                       returnJsonObject.put("Success", "1");

    13                       

    14                        //再servlet返回操作结果前将生成的token保存到单例模式中

    15                       ShareSingleton.getInstance().UsrTokenDictionary.put(LoginId,ecryptToKenUUID);

    16                       

    17                       response.getWriter().println(returnJsonObject.toString());

    18                }

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:cpu占有率的java c# .net php node.js的实现

下一篇:昆明Java培训:Java学习基础

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56