【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

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通知,通知会失效相应的数据,读取的时候,会从数据库中拉取,并存储起来。

 

  • No labels