【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
1.
class Config extends Configuration{ private static Config config = null; private Conf<String> b = Holders.simple("b"); private ObjectColConf<Collection<Test>> tests = Holders.objCollection(new ArrayList<Test>(), Test.class); private ObjectMapConf<Map<String, Test>> expMap = Holders.objMap(new HashMap<String, Test>(), String.class, Test.class); private ColConf<Collection<String>> strings = Holders.collectionr(new ArrayList<String>(),String.class); public static Config getInstance() { if (config == null) { config = ConfigContext.getConfigInstance(Config.class); } return config; } public String getNameSpace() { return "config"; } public void setStrings(List strings){ this.strings.set(strings); } public List<String> getStrings(){ return (List<String>)this.strings.get(); } public void setB(String b) { this.b.set(b); } public String getB() { return this.b.get(); } public void setTests(List<Test> tests) { this.tests.set(tests); } public List<Test> getTests() { return (List<Test>) this.tests.get(); } public void removeTest(Test test) { this.tests.remove(test); } public void setExpMap(Map map) { this.expMap.set(map); } public Map getExpMap() { return this.expMap.get(); } public void removeMapValue(String key) { this.expMap.remove(key); } } class Test extends UniqueKey { private Conf<Integer> a = Holders.simple(0); public Test() { } public Test(int a) { this.setA(a); } public void setA(int a) { this.a.set(a); } public int getA() { return this.a.get(); } }
class StoreDemo{ public static void main(String[] args){ Config config = Config.getInstance(); config.setB("123"); Map<String,Test> testMap = new HashMap<String, Test>(); testMap.put("11",new Test(11)); testMap.put("22",new Test(22)); config.setExpMap(testMap); List<Test> tests = new ArrayList<Test>(); tests.add(new Test(33)); tests.add(new Test(33)); config.setTests(tests); List<String> strings = new ArrayList<String>(); strings.add("a"); strings.add("b"); config.setStrings(strings); } }
执行上述的语句之后,数据库中的存储数据如下:
Id value
config.b 123
config.expMap.11.a 11
config.expMap.22.a 22
config.tests.uBD1difs.a 33
config.tests.1y3t77tf.a 33
config.strings a,,b,,
注意:如果想要修改Map或者Collection中的数据,需要在Config中
public void removeMapValue(String key) {
this.expMap.remove(key);
}
添加类似的方法,让Holder对象来修改,严禁使用 config.getExpMap.remove(key),这样获取的Map在Holder的管理范围之外了,如果不小心调用了这样的修改,则报异常。如果只是查询,则可以使用 config.getExpMap().get(key)之类的。
配置类单例的写法统一修改为如下方式:
public static Config getInstance() {
if (config == null) {
config = ConfigContext.getConfigInstance(Config.class);
}
return config;
}
修改配置触发的时机:
一般配置类都是一个单例类,当该单例类set的时候,集合或者Map remove的时候,都会触发相应的holder的逻辑,这些holder会最终调用数据库的dao来修改相应的数据。
数据缓存:
每个Conf中都有一个成员变量,来标识该Conf持有的数据是否已经初始化,如果已经初始化了,则取数的时候,直接返回持有的数据。
在集群的情况下,若修改配置,则会触发RPC通知,通知会失效相应的数据,读取的时候,会从数据库中拉取,并存储起来。