Кэш конфигурации Apache Commons

Я ищу, как я могу кэшировать свое свойство в структуре apache-commons-configuration. Получение свойства из разных мест, определенных в моем config.xml, занимает много времени. Итак, есть ли кешированная (по времени, например) реализация интерфейса Configuration?


person Alexey Kutuzov    schedule 11.03.2013    source источник


Ответы (3)


Наконец, я написал свой собственный кеш, используя гуаву:

public class Cfg {
    private static Logger log = LoggerFactory.getLogger(Cfg.class);
    private Configuration cfg;
    private LoadingCache<String, Boolean> boolCache;
    private LoadingCache<String, String> stringCache;
    private LoadingCache<String, Float> floatCache;
    private LoadingCache<String, Integer> integerCache;
    private LoadingCache<String, List> listCache;

    @PostConstruct
    public void init() {
        boolCache = CacheBuilder.newBuilder().expireAfterAccess(cfg.getInt("configuration.cache"), TimeUnit.MINUTES).build(new CacheLoader<String, Boolean>() {
            @Override
            public Boolean load(String key) throws Exception {
                return check(cfg.getBoolean(key), key);
            }
        });
        stringCache = CacheBuilder.newBuilder().expireAfterAccess(cfg.getInt("configuration.cache"), TimeUnit.MINUTES).build(new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                return check(cfg.getString(key), key);
            }
        });
        floatCache = CacheBuilder.newBuilder().expireAfterAccess(cfg.getInt("configuration.cache"), TimeUnit.MINUTES).build(new CacheLoader<String, Float>() {
            @Override
            public Float load(String key) throws Exception {
                return check(cfg.getFloat(key), key);
            }
        });
        integerCache = CacheBuilder.newBuilder().expireAfterAccess(cfg.getInt("configuration.cache"), TimeUnit.MINUTES).build(new CacheLoader<String, Integer>() {
            @Override
            public Integer load(String key) throws Exception {
                return check(cfg.getInt(key), key);
            }
        });
        listCache = CacheBuilder.newBuilder().expireAfterAccess(cfg.getInt("configuration.cache"), TimeUnit.MINUTES).build(new CacheLoader<String, List>() {
            @Override
            public List load(String key) throws Exception {
                return check(cfg.getList(key), key);
            }
        });
    }

    public boolean _bool(String key) {
        try {
            return boolCache.get(key);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    public float _float(String key) {
        try {
            return floatCache.get(key);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    public int _int(String key) {
        try {
            return integerCache.get(key);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    public String _string(String key) {
        try {
            return stringCache.get(key);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    public List<String> _list(String key) {
        try {
            //noinspection unchecked
            return listCache.get(key);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    public void setCfg(Configuration cfg) {
        this.cfg = cfg;
    }

    private <T> T check(T el, String key) {
        if (el != null) {
            return el;
        }
        throw new KeyNotFound(key);
    }
}
person Alexey Kutuzov    schedule 15.03.2013

  • Вы можете сохранить объект apache в статической переменной в каком-либо классе и установить значение null, когда закончите. Имейте статический геттер, чтобы прочитать его

  • Не уверен насчет API конфигурации apache, но мы используем статическую HashMap и храним в ней свойства.

если вся строка:

частные статические данные карты = новый HashMap ();

может выставляться как свойства, поэтому вы можете использовать где угодно

public class Props{

private static Map<String, String> data = new HashMap<String, String> ();

public static void put(String name, String val){
    data.put(name,val);
}

public static String  get(String name){
    return data.get(name)
}

public static  void load(){//todo }


public static  void save(){//todo if needed if few change and need persistence}

}

Для любого типа данных, кроме примитивов

public class Props{

private static Map<String, Object> data = new HashMap<String, Object> ();

public static void put(String name, Object val){
    data.put(name,val);
}

public static String  get(String name){
    return data.get(name)
}

public static void load(){//todo }


public static void save(){//todo if needed if few change and need persistence}

}

Если вы хотите, чтобы объекты были удалены через какое-то время, вы можете использовать WhirlyCache вместо HashMap. Я не понимаю, что может пойти не так?

person tgkprog    schedule 11.03.2013

Я расширяю DatabaseConfiguration, чтобы он не попадал в мою базу данных все время. Что касается перезагрузки, я создаю свою конфигурацию там, где она мне нужна, и выбрасываю ее, когда я закончу с ней.

public class MyConfig extends DatabaseConfiguration {

    private WeakHashMap<String,Object> cache = new WeakHashMap<String,Object>();

    public MyConfig(String datasourceString,String section) throws NamingException {
        this((DataSource) new InitialContext().lookup(datasourceString),section);
    }

    protected MyConfig(DataSource datasource,String section) {
        super(datasource, "COMMON_CONFIG","PROP_SECTION", "PROP_KEY", "PROP_VALUE",section);
    }

    @Override
    public Object getProperty(String key){
        Object cachedValue = cache.get(key);
        if (cachedValue != null){
            return cachedValue;
        }
        Object databaseValue = super.getProperty(key);
        cache.put(key, databaseValue);
        return databaseValue;

    }
}
person rjdkolb    schedule 15.07.2013