Re: In 2.3.19, sharing cache storage
Daniel Dekany <[email protected]> Wed, 23 Jul 2014 22:06:03 +0200
| Newsgroups | gmane.comp.web.freemarker.devel |
|---|---|
| Message-ID | <[email protected]> |
Wednesday, July 23, 2014, 8:48:28 PM, Jaime Garza wrote: > Oh, using a shared configuration would be acceptable? That is great > to hear. That is what I have now, but I thought that would be an > anti-pattern. I will continue with that. That's how the guide and the javadocs shows it as well. The configuration meant be a singleton, used from multiple threads. (I often see the mistake where people re-create the Configuration for each request. I don't know where that comes from, but that can totally kill performance.) Of course, then you have independently developed components in the same JVM that use FreeMarker internally, they will have their own singleton configurations, and they should have, but those won't use common templates anyway. > The modifications that I have done have to do with adaptations to > FM to make it more of a DSL. We use FM for formatting emails and SMS > messages. I have modified mostly FMParser.jj keeping a series of svn > patch files for each one of my modifications, hopefully helping me > move to a more recent FM. We have extensions for sql queries with a > <#data> directive, data phrasing as a builtin for sequences, ?unique > for sequences, etc. You can have custom directives and functions without modifying FM, as you certainly know. Surely they are not as flexible/terse as what can be achieved with core directives and built-ins... Making them closer is a future goal. > We maintain our own FM document based on the > 2.3.19 docs. We needed some validation support, Validation of what? > multiple error messages per template (one error was not acceptable,) Is that multiple parsing errors or? > and others. -- Thanks, Daniel Dekany > Thanks > Jaime > > -----Original Message----- > From: Daniel Dekany [mailto:[email protected]] > Sent: Wednesday, July 23, 2014 11:22 AM > To: Jaime Garza > Cc: [email protected] > Subject: Re: [Freemarker-devel] In 2.3.19, sharing cache storage > > The problem with the approach is that Template-s are bound to a > Configuration instance (they store a reference to it), and sometimes > may reach back to it during template execution. However, can't you > just use a common Configuration instance on all those places that share templates? > > (Out of curiosity... what's the modification in 2.3.19 is about?) > > -- > Thanks, > Daniel Dekany > > Wednesday, July 23, 2014, 5:51:52 PM, Jaime Garza wrote: > >> Hi Daniel, >> >> I am trying to share an instance of MruCacheStorage across threads. >> I keep it around across multiple threads and when creating my >> Configuration, I simply do a Configuration#setCacheStorage(). This >> internally calls Configuration#createTemplateCache, which calls >> cache.setConfiguration(this), which calls TemplateCache#clear(), which >> eventually clears the storage. >> >> My use case is that I know that a set of around 200 threads will be >> accessing the same templates over and over (executing the same >> template(s) on a different root namespace) concurrently. I want the >> loading of templates to happen as infrequently as possible. Also, >> since I am on a slightly customized version of 2.3.19, I cannot come to the greatest new version. >> >> The question (or questions) is: is there a way to implement my >> strategy? My current workaround is nasty. I have created a subclass of >> MruCacheStorage, which reads a flag "canClear" from thread local, and >> then decides whether to let the clear proceed or not. I sandwitched >> the call to setCacheStorage() with canClear = false and canClear = >> true >> >> SharedCacheSettings.disallowClear(); >> config.setCacheStorage(storage); >> SharedCacheSettings.allowClear(); >> >> AND >> >> public class SharedCacheStorage extends MruCacheStorage { >> public SharedCacheStorage(int maxStrongSize, int maxSoftSize) { >> super(maxStrongSize, maxSoftSize); >> } >> >> @Override >> public void clear() { >> if (!SharedCacheSettings.canClear()) >> return; >> >> super.clear(); >> } >> } >> >> What is your opinion about my hack? What kind of trouble am I inviting? >> >> Thanks in advance. >> Jaime Garza ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck Code Sight - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds