码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2016-10-06 06:56:05      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

          首先我要说下我实现这个功能接口涉及到的业务和实现的详细流程,然后会说此接口涉及到的相关技术,最后会贴出注释后的详细代码, 这个接口涉及到的是 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 block
103         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= 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 block
147                         e1.printStackTrace();
148                     }
149                       
150                    
151                  }
152                     else//下面就去数据库总查询
153                      {
154                       //如果缓存中没有就从数据库中取出来,然后再修改
155                        mysqlParameter=new String[]{account};
156                           returnData=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=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             else
35             {
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也就是字典的取值id
59                      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                   else
68                    {
69                        
70                       //这里已经有key了,可以去修改数据库了,我这里设置的10秒钟修改一条数据
71                        
72                       String UpdateKey=  KeysArray.getString(updateIndex);
73                         String UpdateJson= TempDictionaryX.getString(UpdateKey);
74                          //这个updatekey就是user的登录id也就是字典的取值id
75                          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 服务器性能提高--->数据库请求频率控制(原创)

标签:

原文地址:http://www.cnblogs.com/xiaoliao/p/5933288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!