我在尋找如何在apache-commons-configuration框架中緩存我的屬性。花費很長時間才能從我的config.xml中定義的不同位置獲取屬性。那麼,有沒有一個緩存(例如,時間,例如)實現Configuration
接口?Apache公用程序配置緩存
3
A
回答
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);
}
}
1
您可以將apache對象保存在某個類的靜態變量中,並在完成時將其設置爲null。有靜態的getter讀取它
不確定有關apache配置API,但我們使用靜態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。我沒有看到有什麼可以出錯?
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;
}
}
相關問題
- 1. 通過Apache 2.2 httpd.conf配置GWT緩存?
- 2. 使用通配符在緩存區中應用程序緩存
- 3. 使用Apache httpd,如何爲給定的UserAgent配置不緩存?
- 4. 配置APC緩存
- 5. APC緩存配置
- 6. JBoss緩存配置
- 7. WebSphere是否緩存Spring應用程序的配置文件?
- 8. 在MVC應用程序中配置NHibernate二級緩存
- 9. 無法在MVC應用程序中配置Redis緩存
- 10. Apache公共日誌記錄配置
- 11. SQLite緩存與應用程序緩存
- 12. Apache公用程序csv跳過行
- 13. 程序緩存
- 14. 緩存程序
- 15. Apache - 緩存來自應用程序服務器的響應
- 16. 如何在Zend Framework 2中緩存內存中的應用程序配置?
- 17. 使用哪個專用緩存配置?
- 18. 禁用Apache Derby的緩存
- 19. Hibernate的緩存配置
- 20. Fusio api緩存配置
- 21. 配置緩存(Java/MySQL)
- 22. 二級緩存配置
- 23. 無法配置緩存
- 24. 彈簧緩存配置
- 25. laravel緩存配置嗎?
- 26. L1數據緩存配置
- 27. 配置約翰尼緩存
- 28. linq緩存和配置datacontext
- 29. FluentNHibernate的緩存配置?
- 30. 配置ehCache:緩存爲空