sascha@541: package de.intevation.gnv.geobackend.base.query;
sascha@541:
sascha@886: import de.intevation.gnv.geobackend.base.Result;
sascha@886:
sascha@541: import java.util.Collection;
sascha@541:
sascha@541: import net.sf.ehcache.Cache;
sascha@886: import net.sf.ehcache.CacheManager;
sascha@541: import net.sf.ehcache.Element;
sascha@541:
sascha@542: import org.apache.log4j.Logger;
sascha@541:
sascha@541: /**
sascha@887: * @author Sascha L. Teichmann
sascha@541: */
sascha@541: public class CachingQueryExecutorFactory
sascha@541: extends QueryExecutorFactory
sascha@541: {
sascha@541: public static final String QUERY_EXECUTOR_FACTORY = "caching.query.executor.config";
sascha@541: public static final String CACHE_NAME = "sql.cache";
sascha@541:
sascha@542: private static Logger log = Logger.getLogger(CachingQueryExecutorFactory.class);
sascha@542:
sascha@541: protected CacheManager manager;
sascha@541:
sascha@541: public CachingQueryExecutorFactory() {
sascha@542: log.info("using SQL cache");
sascha@541: String configFile = System.getProperty(QUERY_EXECUTOR_FACTORY);
sascha@541: manager = configFile != null
sascha@541: ? new CacheManager(configFile)
sascha@541: : new CacheManager();
sascha@541: manager.addCache(CACHE_NAME);
sascha@541: }
sascha@541:
sascha@541: public QueryExecutor getQueryExecutor() {
sascha@541: return new DefaultQueryExceutor() {
sascha@541:
sascha@541: public Collection cachedResults(String query) {
sascha@541: Cache cache = manager.getCache(CACHE_NAME);
sascha@541: Element element = cache.get(query);
sascha@542: if (log.isDebugEnabled()) {
sascha@542: log.debug("found results in SQL cache: " + (element != null));
sascha@542: }
sascha@541: return element != null
sascha@541: ? (Collection)element.getObjectValue()
sascha@541: : null;
sascha@541: }
sascha@541:
sascha@542: public void cacheResults(String query, Collection results) {
sascha@542: log.debug("store results in SQL cache");
sascha@541: Cache cache = manager.getCache(CACHE_NAME);
sascha@541: cache.put(new Element(query, results));
sascha@541: }
sascha@541: };
sascha@541: }
sascha@542:
sascha@542: public void shutdown() {
sascha@542: log.info("shutting down SQL cache");
sascha@542: manager.getCache(CACHE_NAME).flush();
sascha@542: manager.shutdown();
sascha@542: }
sascha@541: }
sascha@541: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: