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

  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缓存起来

时间: 2024-07-30 13:39:37

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

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

一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8). 2.  worker_cpu_affinity 00000001 0000001000000100 00001000 00010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一 个进程分配

PROFINET如何实现实时性

平时我们都听过文艺作品要“源于生活而高于生活”.PROFINET是基于工业以太网的,用文艺范儿的词汇说就是“源于以太网而高于以太网”.那么,PROFINET是怎么做到“高于以太网”的呢? 要做到比普通以太网要犀利,重要的是PROFINET要做到实时性,而要做到实时性,首先就要解决确定性的问题.前面提到普通以太网会出现介质访问冲突的问题,不满足“确定性”的标准.那么一般解决冲突的方法有哪些呢? 既然PROFIBUS总线和PROFINET关系密切,先看看总线是如何的解决方法吧.PROFIBUS的通信

软中断和实时性

软中断和实时性 翻译自:Software interrupts and realtime Linux内核的软中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触软中断.然而它是内核的大多数重要处理的核心.在某些场景下,软中断会以一种不合时宜的方式出现.特别是内核的实时抢占补丁集经常会与软中断产生冲突,该补丁集的最新版本提供了一种解决产生软中断问题的方法,值得一看. 软中断介绍 在3.6.1-rt1补丁集的声明中,Thomas

AIX 中 Paging Space 使用率过高的分析与解决

AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高.系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起.针对这种情况,通常可以靠增加Paging Space来加以缓解:但是当Paging Space已经相当大,而Paging Space使用率仍旧居高不下时,则需要通过进一步的分析来找出原因并加以解决.文中分析了几种Paging Space使用率持续增长直至过高的常见原因,并给出了相应的解决方案,以确保Paging Space使用率被控制在安

CNC系统实时性分析

该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:数控系统中控制装置与现场设备通信的实时性要求,数控系统要快速而有效的对复杂而庞大的操作任务进行处理.例如插补计算,位置控制等.要求响应在毫秒级别. 如果你是软件设计者,要实现这些实时功能,要设计几个实时任务? 三个,一是解码的额是实行,二是插补计算的实时性,三是走刀闭环控制的实时性. 这几个实时任务是时间触发的还是事件触发的,如果是时间触发的,周期大约是多少? 是时间触发的,大约10ms 这几个实

实时性

记得最初接触PROFINET技术,无论是网络上的基本介绍,还是相关的论文,与客户讨论工业以太网技术,实时性都是大家关注的重点内容,每次讨论必提及“实时性”的概念和参数等等.所以讲清楚实时性是一件很应景的事情,必需要做! 所谓“实时”,就是表示“及时”.实时是平时听新闻经常听到的一个词儿,实时资讯.现场实时报道.实时画面,大家要听资讯就要听新鲜的,过时的消息如同旧报纸,可以去卖破烂了.简单的讲,实时就是指从事件的发生.传播.再到获知,这个过程所经历的时间很短.资讯是否实时包含三个标准: 信息是否都

spring中的class配置不能使用properties中的字符串

1.比如在a.properties中我们声明了一个变量: classRoom=com.wc82.ClassRoom 2.然后在spring的配置文件中:applicationContext.xml,有如下的配置: <bean id="classRoom" class="${classRoom}" /> 这样的配置是不可以的,会报错: Caused by: java.lang.ClassNotFoundException: ${classRoom} at

Spring3中用注解直接注入properties中的值

在bean(可是controller, service, dao等了)中,使用@Value注解: @Service public class TestService{ @Value("${sytem.username}") String loginUserName; } 在spring中定义资源文件: <context:property-placeholder />或者org.springframework.beans.factory.config.PropertyPlac

MineCraft01: vanilla服务器server.properties中的隐藏配置

vanilla指的是MineCraft原版服务器,很多人都不知道其隐藏的各种功能,可以配置自动保存,自动备份,出错重启等有用的特性.下面是服务器配置文件server.properties的全部选项. 1 #默认配置 2 level-name=world - 地图名字 3 level-seed= - 地图种子 4 view-distance=10 - 视距 5 gamemode=0 - 游戏模式(0生存1创造2冒险3旁观者) 6 difficulty=1 - 游戏难度 7 allow-flight