Java的Spring内实现的mini版内存"计数器"功能
工期紧急,不让用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版内存"计数器"功能的更多相关文章
- 杂项-Java:Spring
ylbtech-杂项-Java:Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于200 ...
- 唯品会Java开发手册》1.0.2版阅读
<唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
- 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...
- Spring —— 三种配置数据源的方式:spring内置、c3p0、dbcp
01.Spring内置数据源配置Class:DriverManagerDataSource全限定名:org.springframework.jdbc.datasource.DriverManagerD ...
- [Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用
转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring2-portal/ Spring 除了支持传统的基于 Servlet 的 Web 开发之 ...
- Spring事务管理----------整合学习版
作者:学无先后 达者为先 Spring提供了一流的事务管理.在Spring中可以支持声明式事务和编程式事务. 一 spring简介 1 Spring的事务 事务管理在应用程序中起着至关重 ...
- 一起读《Java编程思想》(第四版)
空余时间看<Java编程思想>(第四版)这本书,遇到不懂的知识点就记录在本博客内. 1.复用具体实现 Java代码复用的三种常见方式:继承.组合.代理. 1.继承:使用extends关键字 ...
- Java之Spring基础与IoC
Spring About Spring 开源免费框架,轻量级,非入侵式框架.Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架 Maven repo:Spring Web M ...
- spring内嵌cglib包,这里藏着一个大坑
问题发现 2022-01-21 早上 9 点,订单系统出现大面积的"系统未知错误"报错,导致部分用户无法正常下单.查询后台日志,可以看到大量的 duplicate class at ...
随机推荐
- centos7下安装docker(9.3容器对资源的使用限制-Block IO))
Block IO:指的是磁盘的读写,docker 可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的带宽 注:目前block IO限额只对direct IO(不使用文件缓存)有效. 1.B ...
- javascript中DOM0,DOM2,DOM3级事件模型解析
DOM 即 文档对象模型. 文档对象模型是一种与编程语言及平台无关的API(Application programming Interface),借助于它,程序能够动态地访问和修改文档内容.结构或显示 ...
- 转://三分钟读懂Oracle数据库容灾架之DataGuard
目前市场上针对Oracle数据库常见的容灾产品大致可以分为两大类. Oracle 公司自己的容灾产品 非Oracle公司的容灾产品 Oracle公司目前的容灾产品有我们常见的DataGuard和属于中 ...
- MySQL备份及数据恢复
昨天MySQL意外挂了,重启不成功.然后悲剧的发现,之前做的磁盘快照规则也不知怎么没有生效,数据无备份. 后来咨询.搜索,结果: 1.可以配置两个参数,忽略检查,启动,可以读数据.然后导出,删除文件库 ...
- 阿里巴巴Java开发手册要点笔记 (一)
1:[强制]Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals. 正例:"test".equals(object); 反例:obj ...
- GitLab CI with docker and dind "mount: permission denied (are you root?)"
今天配置gitlab-runner时候出现以上错误,在官网中找到答案 https://gitlab.com/gitlab-org/gitlab-runner/issues/1544
- Qt读取文件时中文乱码问题
在默认情况下,Qt 以 Unicode 格式处理文本字符,因此,字符本身是不会有问题的.之所以出现乱码,原因在于 Qt 不知道将 Unicode 字符以何种方式显示出来. 文本文件含有简 ...
- Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体
一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...
- JAVA实现用户的权限管理
一:写在前面 前两天有个同学问我,那个系统不同的用户登陆不同的页面不同,要写很多个页面啊!而每个用户的在系统中拥有不同的权限,可以访问不同的页面是怎么实现的??那低权限的在浏览器输入高权限的人的url ...
- JS-隐士类型转换‘1’+1、‘1’-1、++‘1’为什么不一样?
当 x=’1’时,x+1x-1+x-x++xtypeof(x+1)typeof(x-1)typeof(+x)typeof(-x)typeof(++x) 的结果分别是多少? 答案: x+1 //’11’ ...