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 ...
随机推荐
- JS的局部变量和全局变量
两段JS代码的区别: <script type="text/javascript"> var a = "Hello"; function test( ...
- go标准库的学习-encoding/base64
参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/base64" base64实现了RFC 4648规定的base6 ...
- Maven快照机制(SNAPSHOT)
文章转自 http://www.cnblogs.com/EasonJim/p/6852840.html 以下引用自https://ayayui.gitbooks.io/tutorialspoint-m ...
- Win10上运行Docker
1. 前言 Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下. Docker发布Mac和Windows 的目标非常简单——开发者可以更加简单方便地在研发机器上使用D ...
- leetcode56:Merge Intervals
大都是自定义了 Interval的比较方法. 突发奇想 int [] arr=new int[intervals.Count*2]; for(int i=0;i<intervals.Count; ...
- Oracle 存储过程或函数传入的数值参数number
在oralce中,如果存储过程需要接收含有数值类型的参数时,如何声明呢.如下: CREATE OR REPLACE PACKAGE GPS.PKG_MONTH_TARGET AS ---------- ...
- Python不能用于大型项目?人们对Python的十大误解
Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...
- Python基础(dict 和 set) 字典和set
dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...
- (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)
@翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...
- [Deep-Learning-with-Python]GAN图片生成
GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案.它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成 ...