Properties常用于项目中参数的配置,当项目中某段程序需要获取动态参数时,就从Properties中读取该参数,使程序是可配置的、灵活的。

  有些配置参数要求立即生效,有些则未必:

  一、实时性要求非常高。项目中,有些参数要求实时性非常高,即在系统运行中,IT人员修改了该参数值,该新参数值要求立即在程序中生效;

  二、实时性要求不高。其实,并不是每个配置参数都要求实时性那么高,有些配置参数基本不会在项目运行当中修改,或即使在运行当中修改,也只要求其在下一次项目启动时生效。

  针对第二种情况,鉴于程序读取Properties文件,IO损耗大、效率较低的现状,我们可以在项目启动时,预先将Properties的信息缓存起来,以备程序运行当中方便、快捷地使用。

  初步想法:在项目启动加载Listener时,将需要缓存的Properties以键值对形式缓存起来。

kick off:

首先,需要一个类存储Properties,并提供接口实现“缓存Properties”和“读取Properties”的动作

 1 package com.nicchagil.propertiescache;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.Hashtable;
 6 import java.util.Map;
 7 import java.util.Properties;
 8
 9 import org.apache.log4j.Logger;
10
11 public class PropertiesCacher {
12
13     private static final Logger logger = Logger.getLogger(PropertiesCacher.class);
14
15     // Properties Cache
16     public static Map<String, Properties> pMap = new Hashtable<String, Properties> ();
17
18     /**
19      * Set properties to properties cache
20      * @param pName
21      * @throws IOException
22      */
23     public static void setProperties(String pName) throws IOException {
24
25         Properties properties = new Properties();
26         InputStream is = null;
27
28         try {
29             is = PropertiesCacher.class.getResourceAsStream(pName);
30             properties.load(is);
31
32         } finally {
33
34             if (is != null) {
35                 is.close();
36             }
37
38         }
39
40         logger.info("Load to properties cache : " + pName);
41         pMap.put(pName, properties);
42     }
43
44     /**
45      * Get properties by properties path
46      * @param pName
47      * @return
48      */
49     public static Properties getProperties(String pName) {
50         return pMap.get(pName);
51     }
52
53     /**
54      * Get properties value by properties path & key
55      * @param pName
56      * @param key
57      * @return
58      */
59     public static String getPropertiesValue(String pName, String key) {
60         if (pMap.get(pName) == null) {
61             return "";
62         }
63
64         return pMap.get(pName).getProperty(key);
65     }
66
67 }

PropertiesCacher

然后,我们需要在项目启动时,触发“缓存Properties”这个动作,这里使用Listener

 1 package com.nicchagil.propertiescache;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.ServletContextEvent;
 6 import javax.servlet.ServletContextListener;
 7
 8 import org.apache.log4j.Logger;
 9
10 public class PropertiesListener implements ServletContextListener {
11
12     private final Logger logger = Logger.getLogger(PropertiesListener.class);
13
14     @Override
15     public void contextDestroyed(ServletContextEvent event) {
16
17     }
18
19     @Override
20     public void contextInitialized(ServletContextEvent event) {
21         try {
22             // Load config.properties
23             PropertiesCacher.setProperties("/resource/config.properties");
24
25             // Load log4j.properties
26             PropertiesCacher.setProperties("/log4j.properties");
27
28         } catch (IOException e) {
29             // TODO Auto-generated catch block
30
31             logger.error(e.getMessage(), e);
32             e.printStackTrace();
33         }
34     }
35
36 }

PropertiesListener

作为web项目,配置了Listener,当然需要在web.xml注册一下了

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 3   <display-name>XlsExporterDemo</display-name>
 4   <welcome-file-list>
 5     <welcome-file>index.html</welcome-file>
 6     <welcome-file>index.htm</welcome-file>
 7     <welcome-file>index.jsp</welcome-file>
 8     <welcome-file>default.html</welcome-file>
 9     <welcome-file>default.htm</welcome-file>
10     <welcome-file>default.jsp</welcome-file>
11   </welcome-file-list>
12   <listener>
13     <listener-class>com.nicchagil.propertiescache.PropertiesListener</listener-class>
14   </listener>
15   <servlet>
16     <description></description>
17     <display-name>DebugPropertiesCacheServlet</display-name>
18     <servlet-name>DebugPropertiesCacheServlet</servlet-name>
19     <servlet-class>com.nicchagil.propertiescache.DebugPropertiesCacheServlet</servlet-class>
20   </servlet>
21   <servlet-mapping>
22     <servlet-name>DebugPropertiesCacheServlet</servlet-name>
23     <url-pattern>/DebugPropertiesCacheServlet</url-pattern>
24   </servlet-mapping>
25 </web-app>

web.xml

最后,自己新建俩properties用于测试,一个是log4j.properties,放在编译根路径下;一个是config.properties,放在编译根路径的resource文件夹下。key值和value值自定义。

这两个properties是本人测试用的,当然你也可以用自己滴,但需要相应地修改PropertiesListener的加载动作哦~

dà gōng gào chéng

现在写一个简单滴Servlet来测试一下是否能成功读取,其中这个Servlet在上述滴web.xml一并注册了,可见“DebugPropertiesCacheServlet”

 1 package com.nicchagil.propertiescache;
 2
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8
 9 public class DebugPropertiesCacheServlet extends HttpServlet {
10     private static final long serialVersionUID = 1L;
11
12     public DebugPropertiesCacheServlet() {
13         super();
14     }
15
16     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
17         String pfile = request.getParameter("pfile");
18         String key = request.getParameter("key");
19
20         if (pfile == null || key == null) {
21             System.out.println(PropertiesCacher.pMap);
22         }
23
24         if (pfile != null && key == null) {
25             System.out.println(PropertiesCacher.getProperties(pfile));
26         }
27
28         if (pfile != null && key != null) {
29             System.out.println(PropertiesCacher.getPropertiesValue(pfile, key));
30         }
31
32     }
33
34     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35         this.doPost(request, response);
36     }
37
38 }

DebugPropertiesCacheServlet

最后,做个简单的测试,使用浏览器分别访问以下url(其中参数可能需要自行改一下),并查看console是否打印正确滴信息

1 http://localhost:8080/XlsExporterDemo/DebugPropertiesCacheServlet
2
3 http://localhost:8080/XlsExporterDemo/DebugPropertiesCacheServlet?pfile=/resource/config.properties
4
5 http://localhost:8080/XlsExporterDemo/DebugPropertiesCacheServlet?pfile=/resource/config.properties&key=url

URL

Oh year,成功了!!!

针对Properties中实时性要求不高的配置参数,用Java缓存起来相关推荐

  1. Keepalived v1.3.5 高可用配置参数总结

    Keepalived v1.3.5 高可用配置参数总结 前言 官网介绍 gratuitous ARP包 VRRP包 VRRP实例 1 全局配置 1.1 全局定义(global_defs ) 1.2 静 ...

  2. nginx 高并发配置参数(转载)

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  3. 设计高并发架构与系统多级缓存架构如何设计?

    高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适合自己 ...

  4. 实时性,更强大 | 瑞芯微3568开发板实时系统测评

    在工业4.0时代,人工智能和工业物联网的发展走上了快车道,越来越多的行业对实时操作系统有了更加迫切的需求.基于此,飞凌嵌入式推出了在OK3568-C开发板 飞凌嵌入式官网-ARM嵌入式核心板.开发板. ...

  5. 飞凌RK3568开发板实时系统来啦!实时性,更强大

    内容来源:飞凌嵌入式官网 www.forlinx.com 在工业4.0时代,人工智能和工业物联网的发展走上了快车道,越来越多的行业对实时操作系统有了更加迫切的需求.基于此,飞凌嵌入式推出了在OK356 ...

  6. 浅谈PROFINET IO通信的实时性

    PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技术的自动化总线标准.作为一项战略性的技术创新,PROFINET为自动化通信 ...

  7. 加密初衷是什么?安全性or实时性

    实时性定义:在规定时间内系统的反应能力.要求在一定的时间内自外部环境收集信息,再及时作出响应.实时性越高,代表系统响应越快. 针对于嵌入式系统来讲,不能单纯以实时性判断产品好坏.要在稳定,安全的基础上 ...

  8. Linux 内核实时补丁 PREEMPT_RT补丁 与 Linux4.1.15 + patch-4.1.15-rt18.patch 补丁,实测实时性差

    Linux4.1.15 + patch-4.1.15-rt18.patch 补丁,实测实时性差 开发环境 发行环境 该环境用于发行 Linux: 4.1.15 preempt_rt: patch-4. ...

  9. 高并发系统三大利器之缓存

    引言 随着互联网的高速发展,市面上也出现了越来越多的网站和app.我们判断一个软件是否好用,用户体验就是一个重要的衡量标准.比如说我们经常用的微信,打开一个页面要十几秒,发个语音要几分钟对方才能收到. ...

最新文章

  1. Log4J配置方式Java工程测试
  2. YOLO项目复活!大神接过衣钵,YOLO之父隐退2月后,v4版正式发布,性能大幅提升...
  3. 苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
  4. 印象笔记电脑版使用技巧_我的印象笔记使用手册(2020)
  5. C++ 指向指针的指针(多级间接寻址)
  6. 合泰单片机 熔丝_合泰单片机HT66F018红外发射C程序及电路图
  7. oracle修改参数
  8. 通过jQuery源码学习javascript(三)
  9. jmeter测试TCP服务器/模拟发送TCP请求
  10. Spring boot Scheduled 配置
  11. 4 初学入门_2020年最新版,如何挑选入门级,进阶级和专业级网球拍(12月更新)...
  12. 【干货】京东电商推荐系统的应用实践.pdf(附下载链接)
  13. 【Kettle】创建资源库用户
  14. pytorch实现attention_Self-Attention手动推导及实现
  15. Java 18 就要来了,新功能很多!
  16. spring教程笔记1
  17. CSS3 结构性伪类选择器(1)
  18. Navicat premium for Mac 12 破解 纯手工
  19. 保证金监控中心查询期货开户密码
  20. 《董明珠的真面目,她到底有多狠》调查问卷

热门文章

  1. 学习日报 7-10(验证码)
  2. 课后作业一 小九九 课后作业二 任意一个数在此范围被七整除的个数...
  3. Ant学习---第二节:Ant添加文件夹和文件夹集的使用
  4. JDK中的23个经典设计模式【转】
  5. 如何动态创建asp.net 用户控件
  6. bookkeeper源码解析
  7. 睡前小故事之Html
  8. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
  9. c语言微秒级延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  10. 小程序空显示undefined_微信小程序显示ESP8266上传的实时显示温湿度数据