你的位置:首页 > Java教程

[Java教程]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= 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=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       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控制缓存中的数据去更新数据库上的数据。

 




泰国旅游团报价优惠泰国蜜月旅游行程参考泰国特价旅游多少钱到泰国游费用报价大全泰国自助游攻略2015春节期间番禺百万葵园景色怎么样?番禺百万葵园春节好玩吗? 三亚自助游攻略?三亚旅游攻略? 番禺百万葵园春节看什么花?2015百万葵园春节开什么花? 三亚冬季度假去哪里?三亚冬季去哪里玩? 龙门川龙峡漂流地址?惠州龙门川龙峡漂流怎么去? 石花水洞门票包含什么?儋州石花水洞乘船收费吗? 龙门川龙峡漂流怎么样?惠州龙门川龙峡漂流旅游攻略? 石花水洞凭本地身份证有优惠吗?儋州石花水洞优惠票怎么买? 惠东南山漂流门票团购价格?南山漂流人多吗? 金龙峡漂流一天游攻略?清远银盏金龙峡漂流要多久? 金龙峡漂流一天漂几次?清远金龙峡漂流每天几漂? 金龙峡好玩吗?清远金龙峡漂流探险怎么样? 2015年沙扒湾团购多少钱?阳西沙扒湾门票可以网上预订吗? 阳江沙扒湾团购价格?沙扒湾多少人可以团购? 东湖坪客家民俗文化村坐什么车去?始兴东湖坪客家民俗文化村路线? 韶关东湖坪民俗文化村怎么去?东湖坪民俗文化村旅游线路? ML04-1106H3EC Datasheet ML04-1106H3EC Datasheet ML04-1106MBC Datasheet ML04-1106MBC Datasheet ML04-1106NC Datasheet ML04-1106NC Datasheet 上海西郊动物园 上海西郊动物园 上海西郊动物园 峨眉山金顶住宿 峨眉山金顶住宿 峨眉山金顶住宿 映秀镇 映秀镇 映秀镇