Java веб-сайт скачать Cache API - PullRequest
0 голосов
/ 04 октября 2011

Я использую 2 модуля в своем Java-приложении, которое загружает ту же веб-страницу.Таким образом, сайт загружается дважды.Чтобы избежать этого, есть ли какой-то слой кэширования, который я могу прикрепить, чтобы фактически загружалась только 1 копия сайта.уровень вроде какого-то прокси веб-кэширования или что-то вроде

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Это может быть немного не по теме, так как в этом решении используется весна:

Вы можете использовать ehcache-spring-annotations для выполнения кэширования без кода.

По сути, вы бы определили кеш в ehcache.xml:

<ehcache>
    ...
    <cache 
       name="htmlCache" 
       maxElementsInMemory="10" 
       eternal="true" 
       overflowToDisk="false" />
</ehcache>

Настройте использование аннотаций кеша в контексте приложения Spring:

<ehcache:annotation-driven />

<ehcache:config cache-manager="cacheManager"/>

<bean 
    id="cacheManager"    
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>

И комментируйте ваш код для автоматического кэширования:

@Cacheable(cacheName = "htmlCache")
public String getHtml(String url) {
    ...
}

Это затем кеширует результаты метода getHtml на основе его параметра (url), поэтому при повторном вызове метода с тем же url результаты будут поступать прямо из кеша .

0 голосов
/ 04 октября 2011

Если два «модуля» находятся в одном и том же jvm и, таким образом, могут обращаться к памяти друг друга, попробуйте использовать «одиночный» кэш. Я склонен использовать кеш HtmlSnippit для кэширования многократных фрагментов HTML с большим успехом:

public class Testing {
    public static void main(String[] args) {

    String html = "<div>The quick brown fox jumps over the lazy dog</div>";

    /* Access via the getInstance() getter */
    HtmlSnippitCache.getInstance().putSnippit("FOXY", html);

    /* Or via local var */
    HtmlSnippitCache cache = HtmlSnippitCache.getInstance();
    String moreHtml = cache.getSnippit("FOXY");

    System.out.println(moreHtml);
}

public static class HtmlSnippitCache {
    /* Singleton implementation */
    private static HtmlSnippitCache instance;

    public static HtmlSnippitCache getInstance() {
        if (HtmlSnippitCache.instance == null)
            synchronized (HtmlSnippitCache.class) {
                if (HtmlSnippitCache.instance == null)
                    HtmlSnippitCache.instance = new HtmlSnippitCache();
            }
        return HtmlSnippitCache.instance;
    }

    /* Ensure only local construction. */
    private HtmlSnippitCache() {}

    /* Clas Impl */
    private HashMap<String, String> map = new HashMap<String, String>();

    public boolean containsSnippit(String key) {
        return map.containsKey(key);
    }

    public String getSnippit(String key) {
        return map.get(key);
    }

    public String putSnippit(String key, String value) {
        return map.put(key, value);
    }

        public int size() {
            return map.size();
        }
    }
}

Теперь методы getSnippit() и putSnippit(), вероятно, должны быть как-то synchronized для обеспечения безопасности потоков, но это совсем другое обсуждение (аргумент?) В целом:)

(Пример должен работать из коробки.)

...