2013-03-06 81 views
0

我这是关系到逻辑不是技术问题,这里是一个场景,(我用Spring + Hibernate的)如何数据字段从数据库Spring MVC中存储

我需要阅读一些数据从数据库返回到每个获取请求的页面,但我想这里有一些破解,如果使用某个脚本某人非常频繁地重新加载页面,这会导致多次调用服务器,因为我认为读取数据并将它们放入全局变量或类变量,通过这样做我最终编写了很奇怪的代码许多全局变量和愚蠢的方式来给它们初始值,就像变量用户状态这是一个字节型变量我已经给-2作为初始值,所以我的内部逻辑可以理解为数据库中的这个变量没有设置值,下面是我的代码

@Controller 
    /* @Secured("hasRole('ROLE_USERS')") */ 
    @RequestMapping("member") 
    public class ApplyRoles { 

     @Autowired 
     private UserInformationForAccessApplication checkUserStatus; 

     // we will initialize variables to avoid auto-initialize by constructor 
     private byte userStatus = Constant.IntializationOfGlobalVariable.GLOBALINIT, 
       requesttype = Constant.IntializationOfGlobalVariable.GLOBALINIT, 
       access = Constant.IntializationOfGlobalVariable.GLOBALINIT; 

     Map<String, Object> accessnrole; 
     Map<String, String> country; 
     Map<String, String> roleArray; 

     @Autowired 
     StudentEnrollmentApplication enrollmentApplication; 

     @Autowired 
     SystemProperties systemProperties; 

     @Autowired 
     EmployeeEnrollmentApplicationResume employeeEnrollmentApplicationResume; 

     @Autowired 
     AccessEnrollmentProcessing accessEnrollmentProcessing; 

     private String role = Constant.IntializationOfGlobalVariable.ROLENOTSET, 
       fname, lname; 

     @RequestMapping(value = "/user", method = RequestMethod.GET) 
     public String checkingUserStatus(Model model, HttpSession session, 
       Authentication authentication) { 

      String sessionemail = "[email protected]";// (String) session 
      // .getAttribute(Constant.SessionAttributes.LOGGEDINUSER); 

      // first check global value, if found set than don't fetch from database 
      if (userStatus == Constant.IntializationOfGlobalVariable.GLOBALINIT) { 
       // get user status from MySQL Database 
       userStatus = checkUserStatus.checkStatus(sessionemail).get(0); 
       if (!(userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED)) { 
        access = checkUserStatus.checkStatus(sessionemail).get(1); 
        model.addAttribute(Constant.SystemName.ACCESS, access); 
       } 
      } 

      if (!(userStatus >= Constant.UserRoleApplicationStatus.NOTAPPLIED || userStatus <= Constant.UserRoleApplicationStatus.REJECTED)) { 
       model.addAttribute("error", "User status is not avaible"); 
       return "redirect:error/pagenotfound"; 
      } else if (userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED) { 
       if (requesttype == Constant.IntializationOfGlobalVariable.GLOBALINIT) { 
        // get request type from MongoDB database 
        requesttype = checkUserStatus.getRequestType(sessionemail); 
       } 

       if (!(requesttype == Constant.RequestType.NORMALEBIT || requesttype == Constant.RequestType.INVITEBIT)) { 
        model.addAttribute("error", 
          "Facing Technichal Issue, Please try again"); 
        return "redirect:error/pagenotfound"; 
       } 

       if (requesttype == Constant.RequestType.INVITEBIT) { 
        if (!(Byte.parseByte((String) accessnrole 
          .get(Constant.SystemName.ACCESS)) == Constant.Access.USERBIT)) { 
         accessnrole = checkUserStatus 
           .getAccessAndRole(sessionemail); 
        } 

        if (accessnrole.get(Constant.SystemName.ACCESS).equals(
          Constant.Database.ERRORMESSAGE) 
          || accessnrole.get(Constant.SystemName.ROLE).equals(
            Constant.Database.ERRORMESSAGE)) { 

         model.addAttribute("error", 
           "Facing Technichal Issue, Please try again"); 
         return "redirect:error/pagenotfound"; 
        } 

        model.addAttribute(Constant.SystemName.ACCESSNROLE, accessnrole); 
        model.addAttribute(Constant.SystemName.REQUESTTYPE, requesttype); 
       } 
      } 

      model.addAttribute(Constant.SystemName.USERSTATUS, userStatus); 


      return "member/user"; 

     } 
} 

避免全局变量我想起诉的饼干,因为我不想让调用数据库在同一会话的每个页面重新加载,一旦其加载会话做的比我不用调用数据库做。

任何可以帮助重新设计的代码上面的部分是非常赞赏

感谢

+0

这完全是错误的级别,试图抵御DDOS攻击。如果你的java应用程序服务器暴露在公共互联网上,它应该在apache后面被代理,并且apache应该防御它。 – Affe 2013-03-06 20:42:14

+0

@Affe我同意你在Apache(Web服务器)上应该处理这种废话,但这也与性能有关,比方说,用户每2分钟重新加载一次页面,我认为Apache应该不会有这种行为的任何问题。我正在通过ehcahe采取什么措施,使用ehcahe缓存结果,一旦写入就通过缓存提供服务。是缓存机制像Ecache是​​会话相关 – Yashprit 2013-03-06 20:54:53

回答

0

你在想什么被称为“缓存”。这是一种标准的计算机科学方法,他们一直在研究如何在有计算机的情况下使用高速缓存。

你可能想去做一些关于这个主题的阅读。我发现这个由谷歌搜索“缓存教程java”http://javalandscape.blogspot.com/2009/01/cachingcaching-algorithms-and-caching.html

最简单的说法(一个项目缓存),你想要的是存储一些数据对象,你最近花了一些时间想出来。但是你也必须有某种标识符,这样你才能知道下一个请求是否要求相同的数据。如果不是,你必须完成所有的工作。如果它是相同的数据,您只需再次返回。

所以算法工作在这个简单的例子是这样的:

if (storedData != null && storedRequestInfo == userRequest.requestInfo) { 
    return storedData; 
} 

storedData = youCalculateTheRequestedData(); 
storedRequestInfo = userRequest.requestInfo; 

return storedData; 

它没有任何真正的编程语言,只是要告诉你它是如何工作的。

requestInfo就是用来查找数据库内容的请求。任何计算后,您都可以将它保存在storedRequestInfo中。

这表明它将一些数据返回给用户,这就是storedData中的内容。

这是一个简单的单元素缓存。 (为了扩展这个,你可以在会话中存储storedRequestInfo和storedData,并且你最终为每个用户存储一个这样的数据,你也可以使用一个Java Map并存储一堆storedData。问题是决定如何限制你的记忆使用如果你为每个用户保存了太多的记忆,你会占用太多的记忆,所以你要限制每个用户可以按大小或数量来分配,然后你必须决定哪一个在简单的情况下,你总是删除存储的内容并存储新的内容

我注意到你的评论ECache只是一个很大的花哨地图我用过的术语我不知道它是否自然会依赖于会话,但是可以通过将会话ID添加到缓存键来实现。)

+0

谢谢,刚开始这个问题后,我来了解一下Ehcache,有没有其他工具可用于java中的缓存依赖于会话或从我指的任何博客/ URL。在java的最后一天配置结束时要做的事情。 – Yashprit 2013-03-06 21:04:26

+0

您认为您需要为任何单个用户存储多少个同一事物的不同实例?如果它通常只有一个,那么在会议中只有一个'最后一个'。在这种情况下,真正的缓存是矫枉过正的。 – 2013-03-06 21:06:45

1

实际上有两件事情,你正在考虑,正确我,如果我错了,但:

  1. 缓存服务器(在Java应用程序)来避免做数据库查询多次为相同的数据。
  2. 避免客户端(浏览器)向服务器发送多个请求。

第一个可以使用缓存来解决,它可以在春天使用任何给定的方法使用注释。该文档可用here

第二个有点棘手,我暂时离开它,除非你发现性能问题。在Spring中再次可以做到这一点,并利用HTTP头中可用的HTTP协议和缓存控制来通知浏览器缓存响应的时间。

+0

你让我正确的一点是我现在想的。但有兴趣了解更多关于第2点的信息,我没有得到它,请你分享一下第2点的URL。 – Yashprit 2013-03-06 21:00:38

+1

看到这个http://www.i-develop.be/blog/2010/07/30 /弹簧MVC-3-0-HTTP-缓存控制报头/ – ramsinb 2013-03-06 21:09:23

相关问题