I would like to share some insights into the entity cache feature, some best practices I like to follow, and some related information.

Some OFBiz experts may disagree with some of my views, and that is okay. Different experiences with OFBiz will lead to different viewpoints.

The OFBiz entity caching feature is intended to improve performance by keeping GenericValue instances in memory - decreasing the number of calls to the database.

Background
----------

Initially, the entity cache was very unreliable due to a number of flaws in its design and in the code that calls it (it was guaranteed to produce stale data). As a result, I personally avoided using the entity cache feature.

Some time ago, Adam Heath did a lot of work on the entity cache. After that, Jacopo and I did a lot of work fixing stale data issues in the entity cache. Today, the entity cache is much improved and unit tests ensure it produces the correct data (except for one edge case that Jacopo has identified).

I mention all of this because the previous quirky behavior led to some "best practices" that didn't make much sense. A search through the OFBiz mail archives will produce a mountain of conflicting and confusing information.

Today
-----

Since the current entity cache is reliable, there is no reason NOT to use it. My preference is to make ALL Delegator calls use the cache. If all code uses the cache, then individual entities can have their caching characteristics configured outside of code. This enables sysadmins to fine-tune entity caches for best performance.

[Some experts might disagree with this approach because the entity cache will consume all available memory. But the idea is to configure the cache so that doesn't happen.]

If you code Delegator calls to avoid the cache, then there is no way for a sysadmin to configure the caching behavior - that bit of code will ALWAYS make a database call.

If you make all Delegator calls use the cache, then there is an additional complication that will add a bit more code: the GenericValue instances retrieved from the cache are immutable - if you want to modify them, then you will have to clone them. So, this approach can produce an additional line of code.


--
Adrian Crum
Sandglass Software
www.sandglass-software.com

Reply via email to