文档章节

使用数据库方式来替换配置文件维护properties

漂泊者及其影子
 漂泊者及其影子
发布于 2015/12/10 23:21
字数 749
阅读 94
收藏 7

一、数据库方式维护可配置属性的好处


  • 开发不用再同时兼顾多个环境属性文件的维护
  • 修改配置属性,不需要重启项目
  • 数据库的方式维护可佩值属性,可以添加更多相关的信息,比如注释、作者,类型甚至树形结构支持


二、表设计


CREATE TABLE `t_properties` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `pid` bigint(20) DEFAULT '0' COMMENT '使配置支持树形结构',
  `type` varchar(50) NOT NULL COMMENT '配置属性的类型',
  `key` varchar(50) NOT NULL COMMENT '键值对之key',
  `value` text NOT NULL COMMENT '键值对之value',
  `comment` varchar(200) DEFAULT NULL COMMENT '注释',
  `suspend` int(11) DEFAULT '0' COMMENT '状态',
  `project` varchar(50) NOT NULL DEFAULT 'iflashbuy' COMMENT '所属项目',
  `author` varchar(50) NOT NULL DEFAULT 'common' COMMENT '作者,该属性维护人',
  PRIMARY KEY (`id`),
  UNIQUE KEY `key` (`key`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;




三、实施

1、BaseProperties.java


/**
 * 
 * <ul>
 * <li>1、尝试使用数据库来维护Properties</li>
 * <li>2、可区分项目</li>
 * <li>3、可根据类型进行分组</li>
 * <li>4、支持树形扩展</li>
 * <li>5、可追踪该字段的作者,维护人</li>
 * </ul>
 * 
 * 
 * @author 漂泊者及其影子
 * @date 2015年12月10日
 */
public class BaseProperties {
	private int id;
	private int pid;// 扩展字段,方便以后支持树形
	private String key;
	private String value;
	private String type;// 所属分组
	private String project;// 所属项目
	private String comment;// 注释
	private String author;// 作者,维护人

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getProject() {
		return project;
	}

	public void setProject(String project) {
		this.project = project;
	}

	public String getComment() {
		return comment;
	}

	public void setComment(String comment) {
		this.comment = comment;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

}



2、PropertiesHelper


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.iflashbuy.base.constant.BaseConstant;

/**
 * 管理从数据库中加载的配置文件
 * 
 * @author limanman
 * @date 2015年12月10日
 */
public class PropertiesHelper {
	private static Map<String, BaseProperties> proMap = new HashMap<String, BaseProperties>();
	private static Logger logger = LoggerFactory.getLogger(PropertiesHelper.class);
	static {
		loadProperties();
	}

	public static String get(String key) {
		BaseProperties baseProperties = proMap.get(key);
		if (baseProperties != null) {
			return baseProperties.getValue();
		}
		return null;
	}

	public static Map<String, BaseProperties> loadProperties() {
		if (proMap == null || BasePropertiesUtil.getBoolPropt("reload_base_properties")) {
			GetMethod method = new GetMethod(BaseConstant.SERVICE_API + "/properties/loadProperties");
			try {
				HttpClient client = new HttpClient();
				// 连接超时设置
				client.getHttpConnectionManager().getParams().setConnectionTimeout(BaseConstant.TIME_OUT);
				// 请求超时
				client.getHttpConnectionManager().getParams().setSoTimeout(BaseConstant.TIME_OUT);

				method.addRequestHeader("Content-Type", "application/json");
				method.getParams().setContentCharset("utf-8");
				client.executeMethod(method);

				if (method.getStatusLine().getStatusCode() == 200) {
					InputStream txtis = method.getResponseBodyAsStream();
					BufferedReader br = new BufferedReader(new InputStreamReader(txtis));

					String tempbf;
					StringBuilder stringBuilder = new StringBuilder(100);
					while ((tempbf = br.readLine()) != null) {
						stringBuilder.append(tempbf);
					}
					Map<String, Object> jsonMap = JsonUtil.jsonStrToMap(stringBuilder.toString());
					Iterator<String> iter = jsonMap.keySet().iterator();

					while (iter.hasNext()) {

						String key = iter.next();

						BaseProperties baseProperties = JsonUtil.formJson(JsonUtil.objectToJsonStr(jsonMap.get(key)),
								BaseProperties.class);
						proMap.put(key, baseProperties);
					}
				}
				logger.info("从数据库加载属性配置文件:\n" + JsonUtil.objectToPrettyJsonStr(proMap));
			} catch (org.apache.commons.httpclient.ConnectTimeoutException e) {
				logger.error("");
			} catch (Exception e) {
				logger.error("从数据库加载属性配置文件失败:" + e);
			} finally {
				// 释放连接
				method.releaseConnection();
			}
		}
		return proMap;
	}

	public static void main(String[] args) {
		System.out.println(PropertiesHelper.get("test"));
	}

}



© 著作权归作者所有

共有 人打赏支持
漂泊者及其影子
粉丝 42
博文 121
码字总数 72105
作品 0
广州
程序员
私信 提问
Maven Multi-environment package

Multi-environment The project is divided into three kinds of environment:local、dev、pro。 不同的环境配置不同,如果只拥有一套配置的话,会导致在不同的环境上需要反复的修改相同配置...

Nathans
2016/09/07
17
0
Hutool之Properties替代——Setting

前言 对于JDK自带的Properties读取的文件,对我们来说有很多限制,首先是编码导致没法加中文的value和注释(用日本的那个插件在Eclipse里可以读写,放到服务器上读就费劲了),再就是不支持变...

路小磊
2014/08/16
0
0
原来实现项目多环境打包部署是如此的简单

一、背景      在软件开发和部署过程中,我们的软件往往需要在不同的运行环境中运行,例如:开发人员本地开发环境、测试团队的测试环境、生产仿真环境、正式生产环境,不同的公司可能还会...

hafiz.zhang
2017/09/20
0
0
Maven知识点记录 - profile

在实际开发过程中,开发环境,测试环境和最后部署上线的环境都是不一样的,像数据库连接,都是要变的。如果不使用Maven的话,我想到的就是修改配置文件,手动的修改;使用Maven的话,就简单的...

Galy_绿
2015/12/19
13
0
SpringBoot 学习二:操作数据库

本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 JdbcTemplate SpringBoot 整合 Redis 前言 在上篇文章 SpringBoot 学习一 中已经学习了 SpringBoot的...

tsmyk0715
2018/09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

https://www.jianshu.com/p/dbffae16ba0b

https://www.jianshu.com/p/dbffae16ba0b

张宏亮1982
11分钟前
0
0
linux基本命令

linux常用shell命令=命令+选项+参数 cd (change directory)切换目录 cd #root根目录 cd / #系统根目录 cd ../../ #返回上上一层目录 ls/dir (list)列出目录下文件 ls -a (--all) #列出所...

陈刚生
16分钟前
0
0
30分钟学会如何使用Shiro

本篇内容大多总结自张开涛的《跟我学Shiro》原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分对我来说急需在项目中使用的知识加以学习。并且...

群星纪元
18分钟前
0
0
常用算法之快速排序python&php

python(快速排序): # -*- UTF-8 -*- def quicksort(arr): if (len(arr)) < 2: return arr; mark = arr[0] #递归条件 #第一种方式 # left = [i for i in arr[1:] if i < mark]; # right = [i ......

山人有妙计
21分钟前
0
0
synchronized关键字

synchronized关键字可分为对象锁和类锁,修饰对象可分为代码块和方法 。 修饰代码块: 1.对象锁:synchronized (this) 或 synchronized (object) : 如果是同一个实例,则代码块的执行有先后;...

某只小强
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部