首页 > 代码库 > Servlet 服务器性能提高--->数据库请求频率控制(原创)

Servlet 服务器性能提高--->数据库请求频率控制(原创)

          首先我要说下我实现这个功能接口涉及到的业务和实现的详细流程,然后会说此接口涉及到的相关技术,最后会贴出注释后的详细代码, 这个接口涉及到的是 app上咻一咻功能,咻一咻中奖的奖品一共有七类,其中四类是兑换券的兑换额,另外三类是咻一咻提升中奖几率的功能券,前四类兑换券当玩家咻到之后就必须去访问数据库更新对应玩家兑换券额度,而且这频率是非常高的。就应为这点,所以我今天想了这个能够对接口进行减压的方法。

一、实现流程

               首先数据库中有个单独的兑换券表,表的结构为:自增id=主键,用户的登录id=外建,4类券的值以一个json的格式的字符串存放到表中的一个字段中,那么现在该表一共就有3个字段(自增id,外建id,json格式的兑换券array),下面我截该表的图出来。

技术分享

 这些数据都是通过单例模式调用缓存中的数据进行更新或则插入的。下面我上流程图。

 技术分享

二、使用技术

        单例模式、缓存、timer线程控制、数据处理使用JSONArray+JSONObject.

三、代码

      1、servlet部分    

技术分享
  1 package Servlet;  2   3 import java.io.IOException;  4 import java.sql.ResultSet;  5 import java.sql.SQLException;  6 import java.util.Date;    7 import java.util.Timer;    8 import java.util.TimerTask;    9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15  16 import org.json.JSONArray; 17 import org.json.JSONException; 18 import org.json.JSONObject; 19  20 import Helper.MySqlHepler; 21 import Helper.ResultToJsonTool; 22 import Helper.ShareSingleton; 23   24 @WebServlet("/GamesXiuXiuServlet") 25 public class GamesXiuXiuServlet extends HttpServlet { 26       27     private static final long serialVersionUID = 1L; 28     protected final String USER_AGENT = "Mozilla/5.0"; 29    public GamesXiuXiuServlet() { 30         super(); 31         // TODO Auto-generated constructor stub 32     } 33   34     @SuppressWarnings("null") 35     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 36     37           38       response.setContentType( "text/html"); 39         response.setCharacterEncoding("utf-8");  40         request.setCharacterEncoding("utf-8");  41       42         String token; 43         String account; 44         String[] mysqlParameter;  45       46            JSONObject returnJsonObject;  //LoadType 47            48            String CheckToken=null; 49            ResultSet returnData; 50          String Type; 51           52          JSONArray returnJsonArray; 53          String ReplaceStr; 54          HttpSession session ; 55            JSONObject SessionSaveDic; 56             57          Type=request.getParameter("type");   58          account=request.getParameter("account");    59          60          token=request.getParameter("token");    61          try { 62                  CheckToken= ShareSingleton.getInstance().UsrTokenDictionary.getString(account); 63                    64              } catch (JSONException e2) { 65                   e2.printStackTrace(); 66              } 67             68          if(!token.equals(CheckToken)) 69          { 70               71               returnJsonObject =new JSONObject(); 72                  73                     try { 74                      returnJsonObject.put("GetType", "4"); 75                         returnJsonObject.put("Success", "0"); 76                         returnJsonObject.put("Msg","token错误,请重新登录!"); 77                  } catch (JSONException e) { 78                        79                      e.printStackTrace(); 80                  } 81                   82                      83                     response.getWriter().println(returnJsonObject.toString()); 84                      85                     return; 86          } 87          if(Type.equals("2")) //更新 88            {     89               90         ReplaceStr=request.getParameter("replaceJsonStr"); 91         session = request.getSession();  92           SessionSaveDic=(JSONObject)session.getAttribute("allMemberDuiHuanKaListData"); 93         try { 94             /*先修改缓存,然后一个timer控件对数据库做间歇性的修改*/ 95         SessionSaveDic.put(account, ReplaceStr); 96         session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic); 97                //设置sessio 永不过期 98         ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic; 99         session.setMaxInactiveInterval(-1);100         101     } catch (JSONException e2) {102         // TODO Auto-generated catch block103         e2.printStackTrace();104     }105        106                          returnJsonObject =new JSONObject();107                           try {108                           109                           returnJsonObject.put("GetType", "3");110                            returnJsonObject.put("Success", "1");111                            returnJsonObject.put("Msg", "修改成功");112                             113                      } catch (JSONException e) {114                   115                       e.printStackTrace();116          }117                         118         response.getWriter().println(returnJsonObject.toString());119                         120            121            }122         //查询出游戏表当前所有数据123         else if(Type.equals("3"))124         {125               session = request.getSession(); 126                //这个值也会自动设置为空    由于咻咻玩的人比较多,所以将抵扣券的组合json放在内存中,然后使用时间间隔方式 更新数据库127                 SessionSaveDic=(JSONObject)session.getAttribute("allMemberDuiHuanKaListData");128              129              if (SessionSaveDic != null) { 130             131                     String SinglePeopleJson=SessionSaveDic.optString(account);132                     if(SinglePeopleJson!="")133                     {134                       try {135                         String JsonListData=http://www.mamicode.com/ SessionSaveDic.getString(account);136                         137                             returnJsonArray=new JSONArray(JsonListData)    ;138                             returnJsonObject =new JSONObject();139                               140                                 returnJsonObject.put("Rows", returnJsonArray);141                                 returnJsonObject.put("GetType", "0");142                                 returnJsonObject.put("Success", "1");143                                response.getWriter().println(returnJsonObject.toString());144                              145                     } catch (JSONException e1) {146                         // TODO Auto-generated catch block147                         e1.printStackTrace();148                     }149                       150                    151                  }152                     else//下面就去数据库总查询153                      {154                       //如果缓存中没有就从数据库中取出来,然后再修改155                        mysqlParameter=new String[]{account};156                           returnData=http://www.mamicode.com/MySqlHepler.executeQueryT("select deductionCard from deductionCardSheet where account=?", mysqlParameter);157                                      158                            try {159                                   returnJsonObject =new JSONObject();160                                   returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData);161                                   162                                JSONObject tempObject=returnJsonArray.getJSONObject(0);163                                164                                  165                                  166                                String JsonList = tempObject.getString("deductionCard");167                                returnJsonArray=new JSONArray(JsonList)    ;168                                 169                                   returnJsonObject.put("Rows", returnJsonArray);170                                   returnJsonObject.put("GetType", "0");171                                   returnJsonObject.put("Success", "1");172                                   173                                     SessionSaveDic.put(account, returnJsonArray);174                                175                                   session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic);176                                   //设置sessio 永不过期177                                 ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic;178                               179                               ShareSingleton.getInstance().KeysArray.put(account);180                              session.setMaxInactiveInterval(-1);181                                  response.getWriter().println(returnJsonObject.toString());182                             } catch (SQLException | JSONException e1) {183                                 184                                185                                e1.printStackTrace();186                            }187                      }188                       return;189                   } else{  190                      191                         //如果缓存中没有就从数据库中取出来,然后再修改192                       mysqlParameter=new String[]{account};193                       returnData=http://www.mamicode.com/MySqlHepler.executeQueryT("select deductionCard from deductionCardSheet where account=?", mysqlParameter);194                                  195                        try {196                               returnJsonObject =new JSONObject();197                               returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData);198                               JSONObject tempObject=returnJsonArray.getJSONObject(0);199                              String JsonList = tempObject.getString("deductionCard");200                             returnJsonArray=new JSONArray(JsonList)    ;201                             202                               returnJsonObject.put("Rows", returnJsonArray);203                               returnJsonObject.put("GetType", "0");204                               returnJsonObject.put("Success", "1");205                              SessionSaveDic=new JSONObject();206                             SessionSaveDic.put(account, returnJsonArray);207                               session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic);208                               //设置sessio 永不过期209                             ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic;210                             211                         synchronized(this) {212                           //一次只能有一个线程进入213                          ShareSingleton.getInstance().KeysArray.put(account);214                          ShareSingleton.getInstance().TastIsOrNoRun=1;215                        }216                         session.setMaxInactiveInterval(-1);217                              response.getWriter().println(returnJsonObject.toString());218                         } catch (SQLException | JSONException e1) {219                             220                            221                            e1.printStackTrace();222                        }223                       224                   }225         }226        227      228     }229 230      231     232      233 234 }
View Code

   2、单例模式部分

技术分享
 1 package Helper; 2 import java.util.Date; 3   4 import java.util.Timer; 5 import java.util.TimerTask; 6  7 import org.json.JSONArray; 8 import org.json.JSONException; 9 import org.json.JSONObject;10 public class ShareSingleton     11 {     12   public     JSONObject UsrTokenDictionary; 13   public     JSONObject UpdateDuiHuanKaDictionary; 14   public    JSONArray    KeysArray;15   public    static int updateIndex; 16   public   int    TastIsOrNoRun;17   public   static ShareSingleton instance=null; 18 19   public static      ShareSingleton getInstance(){     20         if(instance == null){  21             instance = new ShareSingleton();  22               instance.UsrTokenDictionary=new JSONObject();23               instance.UpdateDuiHuanKaDictionary=new JSONObject();24               instance.KeysArray=new JSONArray();25               return instance;26         27         }else{  28       29             if(instance.TastIsOrNoRun==1)30             {31                   timerTask();32                   instance.TastIsOrNoRun=10;33             }34             else35             {36                 37             }38             return instance;     39         }     40     }    41    42   public  static  void timerTask() {  43        44       new Timer().schedule(new TimerTask(){  45           @Override  46           public void run() {  47               48               JSONObject TempDictionaryX=instance.UpdateDuiHuanKaDictionary;49               JSONArray KeysArray=instance.KeysArray;50               try {51                 // JSONObject TempDictionaryX= TempDictionary;   //TempDictionary.getJSONObject("allMemberDuiHuanKaListData");52                 if( updateIndex== KeysArray.length()-1)53                   {54                       //这里已经有key了,可以去修改数据库了,我这里设置的10秒钟修改一条数据55                      String UpdateKey=(String) KeysArray.get(updateIndex);56                     57                   String UpdateJson=   TempDictionaryX.getString(UpdateKey);58                      //这个updatekey就是user的登录id也就是字典的取值id59                      String[]  mysqlParameter=new String[]{ UpdateJson,UpdateKey};60                             //更新游戏61                         //这里要访问两次数据库,第一次修改user表第二次修改游戏表62                   // update userSheet set userIntegral=userIntegral-1,userTotalIntegral=userTotalIntegral+10 where account= ‘13983918071‘;63 64                      MySqlHepler.executeUpdate("update deductionCardSheet set deductionCard=? where account=?",mysqlParameter);65                        updateIndex=0;66                   }67                   else68                    {69                        70                       //这里已经有key了,可以去修改数据库了,我这里设置的10秒钟修改一条数据71                        72                       String UpdateKey=  KeysArray.getString(updateIndex);73                         String UpdateJson= TempDictionaryX.getString(UpdateKey);74                          //这个updatekey就是user的登录id也就是字典的取值id75                          String[]  mysqlParameter=new String[]{ UpdateJson,UpdateKey};76                                 //更新游戏77                             //这里要访问两次数据库,第一次修改user表第二次修改游戏表78                       // update userSheet set userIntegral=userIntegral-1,userTotalIntegral=userTotalIntegral+10 where account= ‘13983918071‘;79 80                          MySqlHepler.executeUpdate("update deductionCardSheet set deductionCard=? where account=?",mysqlParameter);81                          82                       updateIndex++;83                  84                       85                   }86                87             } catch (JSONException e) {88      89                 e.printStackTrace();90             }91               92           }  93       },new Date(),20000);  94  }  95 }   
View Code

四、总结

         用户所有对数据的操作都在缓存中进行,通过单例模式里的timer控制缓存中的数据去更新数据库上的数据。

 

Servlet 服务器性能提高--->数据库请求频率控制(原创)