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 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 }

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 }   

四、总结

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

时间: 2025-01-04 23:03:16

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

20个Linux服务器性能调优技巧

Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要目的是高效处理非交互式进程,响应时间并不是那么重要,相反,能够长时间处理高负载才是最关键的. Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级.Linux服务器有各种用途

[转]20个你不得不知的Linux服务器性能调优技巧

Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要目的是高效处理非交互式进程,响应时间并不是那么重要,相反,能够长时间处理高负载才是最关键的.Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级. Linux服务器有各种用途

网站性能优化 - 数据库及服务器架构篇

我先前曾写过三篇有关网站系统.ASP.NET 性能优化的文章,分别从 SQL 语句.数据库设计.ASP.NET 功能.IIS 7 的套件,来探讨此一性能议题.本帖算是系列作的第四篇,整理了一些我看过的书籍和文章,改从「负载均衡.服务器架构.数据库扩展」的角度,提出一些性能优化的建议,以供有建设中大型网站需求的网友们作为参考. 小弟我先前写过的三篇帖子: (一) 30 分钟快快乐乐学 SQL Performance Tuninghttp://www.cnblogs.com/WizardWu/arc

如何提高数据库性能

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

提高服务器性能和并发能力

从哲学上说,消除瓶颈是提高服务器性能和并发能力的唯一途径.如果你能够消除所有的瓶颈,你就能够最大的发挥硬件性能,让系统的性能和并发数到达最佳.采用多线程多核编程,使用事件驱动或异步消息机制,尽量减少阻塞和等待操作(如I/O阻塞.同步等待或计时/超时等).原理:1.多线程多核编程,消除cpu瓶颈.2.采用IOCP或epoll,利用状态监测和通知方式,消除网络I/O阻塞瓶颈.3.采用事件驱动或异步消息机制,可以消除不必要的等待操作.4.如果是Linux,可以采用AIO来消除磁盘I/O阻塞瓶颈.5.在

集群类型以及提高服务器性能的技术概述

一.集群类型: 1.负载均衡集群(LB集群--Load Balancing): 考虑提高服务器容量,是实现伸缩性扩展的主要技术. 当并发请求出现下面的情形时,就要考虑扩展: 1200请求:1s 1500请求:2s 1800请求:10s 扩展类型: Scale up:向上,需要更强大性能的服务器,缺点是:提高的上限是有限的,并且它的性价比较差. Scale out:向外,需要n多台主机. A.LB的软件解决方案: LVS(Linux Virtual Server). Haproxy. Nginx等

《深入实践Spring Boot》第4章 提高数据库访问性能

目录 第4章 提高数据库访问性能 4.1 使用Druid 4.1.1 配置Druid依赖 4.1.2 关于XML配置 4.1.3 Druid数据源配置 4.1.4 开启监控功能 第4章 提高数据库访问性能 使用关系型数据库的应用系统的性能瓶颈最终还是数据库.随着业务的迅速增长,数据量会不断增大,会逐渐暴露出关系型数据库的弱点,即性能大幅下降.提升关系型数据库的访问性能是开发者的迫切任务.下面从程序开发角度,对提升数据库的访问性进行介绍和探讨. 本章的实例工程使用了分模块的方式设计,各个模块的功能

数据库调优过程(三):提高数据库写入性能方案调查

客户给出建议方案: 一直听客户这边说mycat这个东东,一头雾水,这是什么东东,只听说过mysql不知道mycat,瞬间被鄙视N次方次. 客户提到数据库分片.表复制能提高数据库性能,但可惜对这些技术好像不知道,只知道表分区,不知道分片,知道表批量复制,可以被订阅推送等,及主从复制,不知道这里说的表复制到时所谓什么技术. 客户提到MongoDB,PostgreSQL比较强悍,基本上可以实现集群型结构,表分片相关复制相关技术,但到底在实际应用中怎么是个怎么运行的. 带着上边的问题,我认真的查阅了网上

哪些方法能提高香港服务器性能

哪些方法能提高香港服务器性能 1.为硬盘存储部分增加冗余硬盘和阵列控制卡,提供数据冗余,并且大幅度增加系统的IO性能. 2.增加冗余的CPU,使用SMP(对称性多处理器)技术提高系统性能,并且增加了中心处理的冗余. 3.增加冗余网卡,提高网络的IO性能,在某块网卡出现故障时,服务器不会与网络中断连接.4.增加冗余电源模块,提高服务器的供电能力,一旦某个电源模块出现问题时,系统不会因电源中断而导致宕机.5.增加内存,满足操作系统及不断增加的优化和应用程序的需求,提高香港服务器性能.另外,需要对于香