To achive good result need to hack the VelocityLayoutView. Create a derived class put rendering result into cache. Solution became two times faster. Guess not a bad result.
1: public class DerivedVelocityLayoutView extends VelocityLayoutView {
2: 3: // skipped
4: 5: private oncurrentMap<String, String> cache;
6: 7: // skipped
8: 9: /**
10: * Default constructor.
11: */
12: public DerivedVelocityLayoutView() {
13: super();14: this.requestHelper = new RequestHelperImpl();
15: this.cache = new MapMaker()
16: .concurrencyLevel(16) 17: .softValues() 18: .expiration(3, TimeUnit.MINUTES) 19: .makeMap(); 20: } 21: 22: // skipped
23: 24: /**
25: * The resulting context contains any mappings from render, plus screen content.
26: * @param velocityContext context.
27: * @throws Exception in case of exception
28: */
29: private void renderScreenContent(final Context velocityContext) throws Exception {
30: 31: if (logger.isDebugEnabled()) {
32: logger.debug("Rendering screen content template [" + getUrl() + "]");
33: } 34: 35: final HttpServletRequest servletRequest = (HttpServletRequest) velocityContext.get("request");
36: final String key = getKey(velocityContext); 37: 38: String renderedPage = cache.get(key);39: if (renderedPage == null) {
40: StringWriter sw = new StringWriter();
41: Template screenContentTemplate = getTemplate(getUrl()); 42: screenContentTemplate.merge(velocityContext, sw); 43: renderedPage = sw.toString();44: if (isCacheAllowed(servletRequest.getRequestURI())) {
45: cache.put(key, renderedPage);46: if (logger.isDebugEnabled()) {
47: logger.debug("Cache miss " + key);
48: } 49: }50: } else {
51: if (logger.isDebugEnabled()) {
52: logger.debug("Cache hit " + key);
53: } 54: }55: // Put rendered content into Velocity context.
56: velocityContext.put(this.screenContentKey, renderedPage);
57: } 58: 59: // skipped
60: 61: } 62:
Комментариев нет:
Отправить комментарий