工期紧急,不让用Redis,自己实现了一个Spring内的mini版内存"计数器"功能,很简陋,和业务耦合太紧密,需要改进。

  1. public Long getCreationCounter() {
  2. String attributeNameCreationCounter = "CreationCounter";
  3. Long attributeValueCreationCounter = 0L;
  4. boolean containsCreationCounter = false;
  5.  
  6. String attributeNameExpirationDateTime = "ExpirationDateTime";
  7. Long attributeValueExpirationDateTime = 0L;
  8. boolean containsExpirationDateTime = false;
  9.  
  10. Enumeration<String> attributeNames = ContextUtil.servletContext.getAttributeNames();
  11. while(attributeNames.hasMoreElements())
  12. {
  13. String name = attributeNames.nextElement();
  14. if(!containsCreationCounter && name.equals(attributeNameCreationCounter)){
  15. containsCreationCounter = true;
  16. }
  17. if(!containsExpirationDateTime && name.equals(attributeNameExpirationDateTime)){
  18. containsExpirationDateTime = true;
  19. }
  20. if(containsCreationCounter && containsExpirationDateTime){
  21. break;
  22. }
  23. }
  24.  
  25. boolean isExpired = false;
  26. if(containsExpirationDateTime){//包含超期时间
  27. Object attributeValueExpirationDateTimeObj = ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
  28. if(attributeValueExpirationDateTimeObj == null || attributeValueExpirationDateTimeObj.equals("")){//超期时间为空
  29. isExpired = true;
  30. } else{//超期时间非空
  31. attributeValueExpirationDateTime = (Long)ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
  32. Long nowDateTime = (new Date()).getTime();
  33. if(nowDateTime < attributeValueExpirationDateTime ){//当前时间小于超期时间,未超期
  34. isExpired = false;
  35. }else{//已超期
  36. isExpired = true;
  37. }
  38. }
  39. }else{//不含超期时间
  40. isExpired = true;
  41. }
  42.  
  43. if (isExpired) {//已超期
  44. attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
  45. getExpirationDateTimeNew(attributeNameExpirationDateTime);
  46. } else {//未超期
  47. if(containsCreationCounter){//包含计数器
  48. Object attributeValueCreationCounterObj = ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
  49. if(attributeValueCreationCounterObj == null || attributeValueCreationCounterObj.equals("")){//计数器为空
  50. attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
  51. } else{//计数器非空
  52. attributeValueCreationCounter = (Long)ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
  53. }
  54. } else {//不含计数器
  55. attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
  56. }
  57. }
  58.  
  59. return attributeValueCreationCounter;
  60. }
  61.  
  62. //生成新的超期时间,并存入上下文。
  63. private void getExpirationDateTimeNew(String attributeNameExpirationDateTime) {
  64. Long attributeValueExpirationDateTime = 0L;
  65. Date date= new Date();
  66. Calendar calendar = Calendar.getInstance();
  67. calendar.setTime(date);
  68. calendar.add(Calendar.DAY_OF_MONTH, 1);//增加1天
  69. attributeValueExpirationDateTime= calendar.getTime().getTime();
  70. ContextUtil.servletContext.setAttribute(attributeNameExpirationDateTime, attributeValueExpirationDateTime);
  71. }
  72.  
  73. //从数据库查询存证量计数器,并存入上下文。
  74. private Long getCreationCounter(String attributeNameCreationCounter) {
  75. Long attributeValueCreationCounter;
  76. attributeValueCreationCounter = 0L;
  77. //从数据库读取数据到存证量计数器
  78. Long creationCounter = ((CreationMapper)storageMapper).getCreationCounter();
  79. attributeValueCreationCounter = attributeValueCreationCounter + creationCounter;
  80. ContextUtil.servletContext.setAttribute(attributeNameCreationCounter, attributeValueCreationCounter);
  81. return attributeValueCreationCounter;
  82. }

Java的Spring内实现的mini版内存"计数器"功能的更多相关文章

  1. 杂项-Java:Spring

    ylbtech-杂项-Java:Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于200 ...

  2. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  3. 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

    手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...

  4. Spring —— 三种配置数据源的方式:spring内置、c3p0、dbcp

    01.Spring内置数据源配置Class:DriverManagerDataSource全限定名:org.springframework.jdbc.datasource.DriverManagerD ...

  5. [Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之 ...

  6. Spring事务管理----------整合学习版

    作者:学无先后 达者为先 Spring提供了一流的事务管理.在Spring中可以支持声明式事务和编程式事务. 一  spring简介 1 Spring的事务       事务管理在应用程序中起着至关重 ...

  7. 一起读《Java编程思想》(第四版)

    空余时间看<Java编程思想>(第四版)这本书,遇到不懂的知识点就记录在本博客内. 1.复用具体实现 Java代码复用的三种常见方式:继承.组合.代理. 1.继承:使用extends关键字 ...

  8. Java之Spring基础与IoC

    Spring About Spring 开源免费框架,轻量级,非入侵式框架.Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架 Maven repo:Spring Web M ...

  9. spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的"系统未知错误"报错,导致部分用户无法正常下单.查询后台日志,可以看到大量的 duplicate class at ...

随机推荐

  1. JS的局部变量和全局变量

    两段JS代码的区别: <script type="text/javascript"> var a = "Hello"; function test( ...

  2. go标准库的学习-encoding/base64

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/base64" base64实现了RFC 4648规定的base6 ...

  3. Maven快照机制(SNAPSHOT)

    文章转自 http://www.cnblogs.com/EasonJim/p/6852840.html 以下引用自https://ayayui.gitbooks.io/tutorialspoint-m ...

  4. Win10上运行Docker

    1. 前言 Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下. Docker发布Mac和Windows 的目标非常简单——开发者可以更加简单方便地在研发机器上使用D ...

  5. leetcode56:Merge Intervals

    大都是自定义了 Interval的比较方法. 突发奇想 int [] arr=new int[intervals.Count*2]; for(int i=0;i<intervals.Count; ...

  6. Oracle 存储过程或函数传入的数值参数number

    在oralce中,如果存储过程需要接收含有数值类型的参数时,如何声明呢.如下: CREATE OR REPLACE PACKAGE GPS.PKG_MONTH_TARGET AS ---------- ...

  7. Python不能用于大型项目?人们对Python的十大误解

    Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...

  8. Python基础(dict 和 set) 字典和set

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...

  9. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)

    @翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...

  10. [Deep-Learning-with-Python]GAN图片生成

    GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案.它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成 ...