我正在寻找如何在 apache-commons-configuration 框架中缓存我的属性。从不同的地方获取属性需要很长时间,在我的 config.xml 中定义。那么,是否有接口的缓存(例如按时间)实现Configuration
?
问问题
2507 次
3 回答
1
您可以将 apache 对象保存在某个类的静态变量中,并在完成后设置为 null。有静态吸气剂来阅读它
不确定 apache 配置 API,但我们使用静态 HashMap 并在其中存储属性。
如果所有字符串:
私有静态映射数据 = new 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。我看不出有什么问题?
于 2013-03-11T10:35:52.797 回答
1
最后,我使用番石榴编写了自己的缓存:
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);
}
}
于 2013-03-15T13:49:54.787 回答
1
我扩展了 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;
}
}
于 2013-07-15T09:26:00.547 回答