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

    public Long getCreationCounter() {
String attributeNameCreationCounter = "CreationCounter";
Long attributeValueCreationCounter = 0L;
boolean containsCreationCounter = false; String attributeNameExpirationDateTime = "ExpirationDateTime";
Long attributeValueExpirationDateTime = 0L;
boolean containsExpirationDateTime = false; Enumeration<String> attributeNames = ContextUtil.servletContext.getAttributeNames();
while(attributeNames.hasMoreElements())
{
String name = attributeNames.nextElement();
if(!containsCreationCounter && name.equals(attributeNameCreationCounter)){
containsCreationCounter = true;
}
if(!containsExpirationDateTime && name.equals(attributeNameExpirationDateTime)){
containsExpirationDateTime = true;
}
if(containsCreationCounter && containsExpirationDateTime){
break;
}
} boolean isExpired = false;
if(containsExpirationDateTime){//包含超期时间
Object attributeValueExpirationDateTimeObj = ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
if(attributeValueExpirationDateTimeObj == null || attributeValueExpirationDateTimeObj.equals("")){//超期时间为空
isExpired = true;
} else{//超期时间非空
attributeValueExpirationDateTime = (Long)ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime);
Long nowDateTime = (new Date()).getTime();
if(nowDateTime < attributeValueExpirationDateTime ){//当前时间小于超期时间,未超期
isExpired = false;
}else{//已超期
isExpired = true;
}
}
}else{//不含超期时间
isExpired = true;
} if (isExpired) {//已超期
attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
getExpirationDateTimeNew(attributeNameExpirationDateTime);
} else {//未超期
if(containsCreationCounter){//包含计数器
Object attributeValueCreationCounterObj = ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
if(attributeValueCreationCounterObj == null || attributeValueCreationCounterObj.equals("")){//计数器为空
attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
} else{//计数器非空
attributeValueCreationCounter = (Long)ContextUtil.servletContext.getAttribute(attributeNameCreationCounter);
}
} else {//不含计数器
attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter);
}
} return attributeValueCreationCounter;
} //生成新的超期时间,并存入上下文。
private void getExpirationDateTimeNew(String attributeNameExpirationDateTime) {
Long attributeValueExpirationDateTime = 0L;
Date date= new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, 1);//增加1天
attributeValueExpirationDateTime= calendar.getTime().getTime();
ContextUtil.servletContext.setAttribute(attributeNameExpirationDateTime, attributeValueExpirationDateTime);
} //从数据库查询存证量计数器,并存入上下文。
private Long getCreationCounter(String attributeNameCreationCounter) {
Long attributeValueCreationCounter;
attributeValueCreationCounter = 0L;
//从数据库读取数据到存证量计数器
Long creationCounter = ((CreationMapper)storageMapper).getCreationCounter();
attributeValueCreationCounter = attributeValueCreationCounter + creationCounter;
ContextUtil.servletContext.setAttribute(attributeNameCreationCounter, attributeValueCreationCounter);
return attributeValueCreationCounter;
}

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. Excel中IF函数的嵌套用法(多条件)

    Excel中IF函数的嵌套用法(多条件)   Excel中IF函数的嵌套用法(多条件)   函数格式:if(logical_test,value_if_true,value_if_false).其中: ...

  2. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

  3. sw-stream

    https://github.com/kumavis/sw-stream ServiceWorkerStream and ServiceWorkerGlobalListener This a util ...

  4. Linux中运行SpringBoot项目,永久运行

    将写好的springboot项目打成jar包: 项目右键 -- Run As -- Maven build... ---此时出现下图 1.Goals 中填写:install 2.Skip Tests复 ...

  5. Python排序算法——希尔排序(Shell’s Sort)

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...

  6. RF

    大家在日常工作中常常解除RF模块,RF的意思就是:radio frequency的意思,就是无线电波频率的意思. RF射频范围:300KHz-300GHz; 其中小于1000HZ以内的当然是低频: 大 ...

  7. Selenium:HTML测试报告

    自动化测试过程中,获得用例的执行结果后,需要有具象化.简洁明了的测试结果,比如:用例执行时间.失败用例数.失败的原因等,这时候,就需要用到测试报告. HTML测试报告是python语言自带的单元测试框 ...

  8. <转>jmeter(十七)目录结构

    之前了解过jmeter的目录结构,但只知道一些常用的配置文件,看到一篇介绍的比较详细的博客,就转载过来,当然,其实是自己懒得再去搜集更多资料慢慢看了,时间不够用... 原文链接:http://www. ...

  9. jmeter(五)JDBC Request

    jmeter中取样器(Sampler)是与服务器进行交互的单元.一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录响应时间信息 有时候工作中我们需要对数据库发起请求或者对数据 ...

  10. python wsgi 简介

    wsgi全称是"Web Server Gateway Interfacfe",web服务器网关接口,wsgi在python2.5中加入,是web服务器和web应用的标准接口,任何实 ...