【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
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通知,通知会失效相应的数据,读取的时候,会从数据库中拉取,并存储起来。