工期紧急,不让用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. attachBaseContext

    at android.content.ContextWrapper.attachBaseContext(ContextWrapper.java:66) at android.view.ContextT ...

  2. HTML和CSS实现左侧固定宽度右侧内容可滚动

    在做移动端页面的时候,经常会碰到一个div中分左右两个div,左侧div固定宽度或百分比,右侧div中内容左右溢出,需要左右滑动才可以浏览到全部内容,为此写了一个demo. 处理这个问题的核心关键点是 ...

  3. 水题,P1789 【Mc生存】插火把 (暴力即可)

    #include<cstdio> #define maxn int(1e4) bool dp[maxn][maxn]; int n; void f1(int x, int y) { dp[ ...

  4. oracle创建em

    语法:emca -config dbcontrol db [-repos (create | recreate)] [-cluster] [-silent] [-backup] [parameters ...

  5. node.js取参四种方法req.body,req.params,req.param,req.body

    参考:https://my.oschina.net/u/2519530/blog/535309 获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实 ...

  6. PAT A1016 Phone Bills (25 分)——排序,时序

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  7. EasyUI panel

    1.脚本生成panel 2.panel属性 3.panel事件 4.panel方法 一 脚本生成panel <div id="tt"></div> < ...

  8. VD: error VERR_FILE_NOT_FOUND

    virtualbox制作的镜像文件如果移动了位置,比如从C盘移到D盘,那么再次打开时会提示找不到文件. 解决办法: 打开virtualbox,在“管理”菜单中打开“虚拟介质管理”,在“虚拟硬盘”选项卡 ...

  9. 解析LED发光效率

    解析LED发光效率 来源:--作者:--浏览:532时间:2016-08-10 14:18 关键词: 发光效率为评测光源效率的指标,用光源发出的光通量 (lm)与向光源输入的电力(W)之比表示.单位为 ...

  10. Ionic 部分手机升级不成功的问题

    Android端的手机App发布之后的一段时间,用户反馈App无法升级的情况. 原因分析: 对代码进行错误在线,提示是FileNOTFindException错误,确定是下载的时候保存的目的路径 不存 ...