`
uule
  • 浏览: 6350419 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

系统配置内存缓存SystemConfiguration

 
阅读更多

先从数据库中取配置信息,数据库没有则从properties文件中取。

不用频繁读取数据库。

 

用一个静态的HashMap实现。

/**
 * 系统配置内存缓存
 *
 */
public class SystemConfiguration {

	private static final Logger logger = LoggerFactory.getLogger(SystemConfiguration.class);
	
	/**
	 * sysconfig.properties中配置信息
	 */
	private static Properties sysconfigprop;
	
	/**
	 * SYS_CONFIG表中配置信息
	 */
	private static Map<String, String> sysconfigdb;

	static {
		sysconfigprop = new Properties();
		try {
			sysconfigprop.load(SystemConfiguration.class.getClassLoader()
					.getResourceAsStream("sysconfig.properties"));
		} catch (IOException e) {
			logger.error("load sysconfig.properties failed...");
			e.printStackTrace();
		}
		loadDatabase();
	}
	
	/**
	 * 加载数据库中配置项
	 * com.vispractice.soa.lightesb.common.listener.EsbInitListener中调用
	 * 
	 */
	private static void loadDatabase() {
		logger.debug("loadDatabase begin...");
		
		sysconfigdb = new HashMap<String, String>();
		// 获取spring bean容器
		WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
		ISysConfigDao sysconfigdao = (ISysConfigDao) wac.getBean("iSysConfigDao");
		List<SysConfig> config = sysconfigdao.getAll();
		
		logger.debug("config [db] list :");
		
		for(SysConfig c : config){
			if(Constants.ENABLED_FLAG_Y.equals(c.getEnabledFlag())){
				logger.debug(c.toString());
				
				sysconfigdb.put(c.getConfigName(), c.getConfigValue());
			}
		}
		logger.debug("loadDatabase end...");
	}

	/**
	 * 获取配置值
	 * 如果有相同配置项,数据库中配置项优先级更高
	 * 
	 * @param name
	 * @return
	 */
	public static String getConfigByName(String name) {
		String config = sysconfigdb.get(name);
		if(config == null){
			config = sysconfigprop.getProperty(name);
			
			logger.debug("this config from properties... " + name + "=" + config);
		}
		return config;
	}
	
	/**
	 * 添加新属性到缓存
	 * 
	 * @param config
	 */
	public static void addOrUpdateToSysConfigDb(Map<String, String> config){
		logger.debug("addOrUpdateToSysConfigDb : " + config);
		
		// 同步
		synchronized (sysconfigdb){
			sysconfigdb.putAll(config);
		}
		
		logger.debug("sysconfigdb : " + sysconfigdb);
	}
	
	/**
	 * 从缓存中删除属性
	 * 
	 * @param configName
	 */
	public static void removeFromSysConfigDb(List<String> configName){
		logger.debug("removeFromSysConfigDb : " + configName);
		
		// 同步
		synchronized (sysconfigdb){
			for(String c : configName){
				sysconfigdb.remove(c);
			}
		}
		
		logger.debug("sysconfigdb : " + sysconfigdb);
	}
	
}

 

调用:

String serverHome = SystemConfiguration.getConfigByName(Constants.MIDDLEWARE_HOME); //serverHome
String proxyBuildPath = SystemConfiguration.getConfigByName(Constants.SRV_PKG_PATH); //proxyBuildPath
String address = SystemConfiguration.getConfigByName(Constants.SERVER_ADDRESS);

 。。

 

 例子2:

(将各种开关也放到缓存中,不用在使用时再查询)

import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 全局配置
 *
 */
public class SysConfigCache {

	private static final Logger logger = LoggerFactory.getLogger(SysConfigCache.class);
	/**
	 * sysconfig.properties中配置信息
	 */
	private static Properties sysconfigprop;
	/**
	 * SYS_CONFIG表中配置信息
	 */
	private static Map<String, String> sysconfigdb = new Hashtable<String, String>();
	/**
	 * 全局日志开关
	 */
	private static boolean logSwitch = true;
	
	private static boolean inited = false;
	
	private static boolean parameterCheck = true;
	
	private static boolean serviceAccess = false;

	public final static String LOG_SWITCH="log.switch";
	public final static String SRV_PARAMETER_CHECK_ACCESS="SRV_PARAMETER_CHECK_ACCESS";
	public final static String SERVICE_ACCESS = "SERVICE_ACCESS";
	
	static {
		sysconfigprop = new Properties();
		try {
			InputStream in = SysConfigCache.class.getClassLoader().getResourceAsStream("sysconfig.properties");
			if(in!=null){
				sysconfigprop.load(in);
				setProperty(LOG_SWITCH,sysconfigprop.getProperty(LOG_SWITCH));
				inited = true;
			}else{
				logger.error("failed to found sysconfig.properties file ");
			}
			
		} catch (IOException e) {
			logger.error("load sysconfig.properties failed...",e);
		}
	}
	
	/**
	 * 添加配置项
	 * @param key
	 * @param value
	 */
	public static void putSysConfigDB(String key,String value){
		if(sysconfigdb!=null){
			logger.debug("put ["+key+":"+value+"] into SysConfigCache.");
			sysconfigdb.put(key, value);
			setProperty(key,value);
		}
	}
	
	/**
	 * 获取配置值
	 * 如果有相同配置项,数据库中配置项优先级更高
	 * 
	 * @param name
	 * @return
	 */
	public static String getConfigByName(String name) {
		String config = sysconfigdb.get(name);
		if(config == null){
			config = sysconfigprop.getProperty(name);
			logger.debug("this config from properties... " + name + "=" + config);
		}
		return config;
	}
	
	/**
	 * 从缓存中删除属性
	 * 
	 * @param configName
	 */
	public static void removeFromSysConfigDb(List<String> configName){
		logger.debug("removeFromSysConfigDb : " + configName);
		// 同步
		synchronized (sysconfigdb){
			for(String c : configName){
				logger.debug("remove ["+c+"] from SysConfigCache.");
				sysconfigdb.remove(c);
				setProperty(c,null);
			}
		}
		logger.debug("sysconfigdb : " + sysconfigdb);
	}
	
	/**
	 * 从缓存中删除属性
	 * 
	 * @param configName
	 */
	public static void removeFromSysConfigDb(String configName){
		logger.debug("remove ["+configName+"] from SysConfigCache.");
		// 同步
		synchronized (sysconfigdb){
				sysconfigdb.remove(configName);
				setProperty(configName,null);
		}
		logger.debug("sysconfigdb : " + sysconfigdb);
	}
	
	private static void setProperty(String key,String value){
		if(SysConfigCache.LOG_SWITCH.equals(key)){
			SysConfigCache.setLogSwitch("1".equals(SysConfigCache.getConfigByName(SysConfigCache.LOG_SWITCH)));
		}
		if(SysConfigCache.SRV_PARAMETER_CHECK_ACCESS.equals(key)){
			SysConfigCache.setParameterCheck("1".equals(SysConfigCache.getConfigByName(SysConfigCache.SRV_PARAMETER_CHECK_ACCESS)));
		}
		
		if(SysConfigCache.SERVICE_ACCESS.equals(key)){
			SysConfigCache.setServiceAccess("1".equals(SysConfigCache.getConfigByName(SysConfigCache.SERVICE_ACCESS)));
		}
	}
	

	public static boolean isLogSwitch() {
		return logSwitch;
	}

	public static void setLogSwitch(boolean logSwitch) {
		SysConfigCache.logSwitch = logSwitch;
	}

	public static boolean isInited() {
		return inited;
	}

	public static void setInited(boolean inited) {
		SysConfigCache.inited = inited;
	}

	public static boolean isParameterCheck() {
		return parameterCheck;
	}

	public static void setParameterCheck(boolean parameterCheck) {
		SysConfigCache.parameterCheck = parameterCheck;
	}

	public static boolean isServiceAccess() {
		return serviceAccess;
	}

	public static void setServiceAccess(boolean serviceAccess) {
		SysConfigCache.serviceAccess = serviceAccess;
	}
	
}

 

 例子3:

简单Cache

import java.util.HashMap;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 参数校验缓存类
 *
 */
public class ServiceDataCache {

	private static final Logger logger = LoggerFactory.getLogger(ServiceDataCache.class);
	private static HashMap<String,List> cache = new HashMap<String,List>();
	public static boolean checkAccess = false;

	/**
	 * 填充缓存
	 * @param serviceNameEn
	 * @param paramsList
	 */
	public static void setCache(String serviceNameEn, List paramsList){
		logger.info("set Data to Cache begin..");
		if(cache != null){
			if(!cache.containsKey(serviceNameEn)){
				cache.put(serviceNameEn, paramsList);			
			}
		}	
		
		logger.info("set Data to Cache end.");
	}
	
	
	/**
	 * 从缓存取数据
	 * @param serviceNameEn
	 * @return
	 */
	public static List GetCache(String serviceNameEn){
		logger.info("Get Data from Cache begin.");
		if(cache != null){
			if(cache.containsKey(serviceNameEn)){
				return cache.get(serviceNameEn);				
			}
			
		}
		return null;
	}
	
	
	/**
	 * 校验缓存中是否存在
	 * @param serviceNameEn
	 * @return
	 */
	public static boolean checkCacheExist(String serviceNameEn){
		logger.info("check Cache Exist begin.");
		if(cache != null){
			return cache.containsKey(serviceNameEn.trim());			
		}
		return false;
	}
}

 

 

。。

 

分享到:
评论

相关推荐

    C#读取web.config配置,建立高速缓存机制

    在C#代码中,可以通过System.Configuration命名空间提供的ConfigurationManager类来读取这些配置信息。例如: ```csharp string ip = ConfigurationManager.AppSettings["IP"]; string port = ConfigurationManager...

    Sql缓存依赖示例

    当数据库中的特定表或特定行发生更改时,系统会自动清除与之关联的缓存,确保应用程序获取到最新的数据。 在创建Sql缓存依赖示例时,首先需要设置数据库环境。你需要在SQL Server中创建一个启用触发器的表,这个...

    .net抽象缓存工厂redis、httpruntime

    `HttpRuntimeCache`是.NET Framework中内置的内存缓存,它基于System.Web命名空间下的HttpRuntime类。这个缓存适用于小型应用或者在不支持分布式缓存的环境下。使用HttpRuntimeCache,我们可以方便地将数据存储在Web...

    [EntLib]微软企业库5 0 学习之路 第四步 使用缓存提高网站的性能(EntLib Caching

    - **内存存储**:这是最基础的缓存方式,将数据存储在应用程序的内存中,提供快速的访问速度,但数据不会持久化,重启应用程序后数据会丢失。 - **独立存储(Isolated Storage)**:数据被存储在本地磁盘的隔离...

    java缓存

    在Java中,最常用的缓存库之一是Ehcache,它是一个开放源码的、高性能的、内存缓存解决方案。要创建一个简单的Ehcache实例,你需要在项目中引入Ehcache的依赖,并配置一个cache manager和具体的缓存实例: ```xml ...

    DELL服务器系统提示错误解决的若干办法.docx

    * 解决方法:检查电源设备是否支持系统组件,降低系统配置,确保电源设备能够满足系统需求。 Node Interleaving disabled! Memory configuration does not support Node Interleaving * 原因:内存配置不支持节点...

    DELL-服务器系统提示错误解决的若干办法.doc

    检查电源设备是否支持处理器、内存模块和扩充卡的系统配置。 3. Alert! Node Interleaving disabled! Memory configuration does not support Node Interleaving. 解决方法:检查内存模块是否安装在支持节点交叉的...

    config.sys

    本文将详细解析CONFIG.SYS的功能和用法,帮助读者理解其在系统配置中的核心地位。 CONFIG.SYS,全称Configuration System,是DOS系统中的一个初始化配置文件。它的主要任务是在系统启动时加载设备驱动程序和服务,...

    AppFabric缓存管理和使用[收集].pdf

    Windows Server AppFabric缓存是微软提供的一个分布式内存对象缓存解决方案,专为提升.NET应用程序,特别是ASP.NET应用程序的性能而设计。它与开源的Memcached类似,但提供了更丰富的管理和扩展能力。在本文中,我们...

    PhoenixBIOSSetupUtility设置图解.doc

    在高级设置中,用户可以进行更深入的系统配置: 1. **Multiprocessor Specification**:多重处理器规范,这是针对多处理器系统的设置,如选择MPS的1.4版本,可以支持更多的PCI总线和未来的升级,适用于多核CPU的...

    PhoenixBIOSSetupUtility设置图解借鉴.pdf

    - Memory Cache:启用或禁用内存缓存,开启能提升系统速度,但可能会增加功耗。 - Cache System BIOS Area:控制BIOS区域的缓存,Write Protect设置为默认的忽略写入/储存设定。 - Cache Video BIOS Area:控制...

    initialize_mmu.rar_memory

    RCW(Reset Configuration Word)通常用于设置和初始化一些高级的硬件特性,比如在某些SoC(System on Chip)中,RCW可能会用来配置内存控制器的初始状态,包括内存映射、时序参数等。由于非MX核心的内存控制器不...

    cisco初始化的翻译

    “---System Configuration Dialog---”指示符后的内容,表明了设备在启动时会提供一个系统配置对话框,用户可以选择是否继续进行配置。这是一个重要的初始化步骤,允许管理员设置基本的网络参数,如IP地址、子网...

    AADL introduction

    5. **系统配置(System Configuration)**:AADL允许用户定义系统级别的布局,包括组件的物理位置、连接关系以及执行环境。 6. **属性(Properties)**:AADL支持对组件和系统的性能属性进行量化描述,如带宽、时延...

    SOLARIS 10性能监视工具

    本章节旨在介绍一系列可用于诊断和确定系统配置、开发以及性能问题的工具。这些工具不仅有助于理解系统的当前状态,还能帮助用户解决可能出现的问题。在本书后续部分,我们将利用其中的一些工具来分析特定的情况。 ...

    安装惠普笔记本电脑安装系统.pdf

    在BIOS中,找到“System Configuration”(系统配置)选项,然后找到“SATA Native Support”(SATA原生支持)属性,并将其设置为“Disabled”(禁用)。这样做的原因是禁用SATA原生支持可以使安装程序识别到硬盘,...

    BIOS操作手册

    BIOS(Basic Input/Output System,基本输入/输出系统)是一种固件,存储在计算机主板上的ROM(Read-Only Memory, فقط读存储器)中,负责管理计算机的硬件组件,并提供基本输入/输出操作。BIOS Setup Utility是...

    ehcache例子

    Ehcache支持在内存和磁盘上存储数据,并且可以配置为分布式缓存,以适应大型分布式系统的需求。由于Ehcache的高效性和易用性,它成为了许多Java开发者在构建高性能应用程序时的首选缓存库。 **Ehcache在Maven项目中...

    Unxi核心参数,介绍unix一些核心参数的配置

    4. **Filesystem configuration(不同文件系统的配置参数)**: 这些参数涉及到文件系统的类型、挂载点、权限等,如`MAXMOUNTS`定义最大挂载点数量,`SWAPSPACE`设置交换分区大小等。 5. **Virtual Disks(虚拟...

Global site tag (gtag.js) - Google Analytics