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. 针对系统中磁盘IO负载过高的指导性操作

    针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...

  2. 磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作

    磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参 ...

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

    声明:原文章来自http://blog.csdn.net/oonets334/article/details/7528558.如需知道更详细内容请访问. 一.一般来说nginx 配置文件中对优化比较有 ...

  4. nginx 高并发配置参数

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

  5. 在CentOS 6.5 中安装JDK 1.7 + Eclipse并配置opencv的java开发环境(二)

    一.安装JDK 1.7 1. 卸载OpenJDK rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5. ...

  6. 【原创】有利于提高xenomai 实时性的一些配置建议

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.影响因素 1.硬件 2.BISO(X86平台) 3.软件 4. 缓存使用策略与GPU 二.优化措施 1. BIO ...

  7. (转)AIX 中 Paging Space 使用率过高的分析与解决

    AIX 中 Paging Space 使用率过高的分析与解决 原文:https://www.ibm.com/developerworks/cn/aix/library/au-cn-pagingspac ...

  8. Linux 2.6 内核实时性分析 (完善中...)

      经过一个月的学习,目前对linux 下驱动程序的编写有了入门的认识,现在需要着手实践,编写相关的驱动程序. 因为飞控系统对实时性有一定的要求,所以先打算学习linux 2.6 内核的实时性与任务调 ...

  9. 物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)

    物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)   2015年11月14日|    by: nbboy|    Category: 系统设计, 缓存设计, 高性能系统 摘要 ...

随机推荐

  1. PyQt5教程——菜单和工具栏(3)

    PyQt5中的菜单和工具栏 在这部分的PyQt5教程中,我们将创建菜单和工具栏.菜单式位于菜单栏的一组命令操作.工具栏是应用窗体中由按钮和一些常规命令操作组成的组件. 主窗口 QMainWindow类 ...

  2. MySQL 分库备份

    mysql -uroot -p'password' -e "show databases;"|grep -Evi "database|infor|perfor" ...

  3. 伪造A标签跳转(非window.open)Jquery

    尊重原创:http://blog.csdn.net/zdb330906531

  4. 封装document.getElementById(id)

      CreateTime--2016年12月18日11:42:45Author:Marydon封装document.getElementById(Id)方法 <script type=" ...

  5. 〖Windows〗Linux的Qt程序源码转换至Windows平台运行,编码的解决

    在中国大陆,Windows默认的编码是gb2312,而Linux是UTF8: 多数情况下,把Linux上的程序转换至Windows上运行需要进行编码转换才能正常显示: 而其实大可以不必的,同样,文件使 ...

  6. springmvc json结合

    获取json数据     名字一样就获取了 user @RequestMapping("/addUser") public String addUser(User user,Htt ...

  7. function声明的深刻含义和jquery属性注入区别

    在js中有两类对象 1.json对象,仅仅代表对象而已 2.function声明的对象 (1) 它定义了构造器  可以用new 对象 来初始化 数据对象 (2) 它指明对象是一个函数对象  通过后面加 ...

  8. 【C++】关于带const的指针问题

    区分const出现在*前还是*后 前: 例如const int *p,这种表示情况下,p本身可以改变,即p可以指向不同的地址, 但是p指向的内容不可改变. 就像你喜欢看书,图书馆规定你可以任意借阅及更 ...

  9. SecureCRT 设置中文编码

    http://www.diybl.com/course/6_system/linux/Linuxjs/20090326/163546.html     装了个secureCRT,可老是出现乱码  于是 ...

  10. Java中堆内存和栈内存详解【转】

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...