Sometimes I write a blog post because I want to say something to others, other times because I want to help others, and sometimes I write one for myself. This is one of the latter type of posts.
I find that nothing drives home a lesson I learned like writing out the solution on my blog, and more than one time I’ve searched my blog because I remember I had written about a topic of current interest in the past.
If you want hibernate, a java ORM tool, to cache your query results, there’s a section in the hibernate manual. Like most of the hibernate documentation, it’s quite good. One thing that caught me up, though, is that I thought that all queries were cached, as soon as you had set up the correct configuration in your hibernate xml files and marked your objects as cacheable.
However, this is not the case, as I learned when I turned on the mysql query log and looked at the calls the interesting web application was making. I did quite a bit of searching, but the answer was in the same section that told me how to set up the configuration (as well as in this forum post).
…most queries do not benefit from caching or their results. So by default, individual queries are not cached even after enabling query caching. To enable results caching for a particular query, call
Doh! Following these instructions decreased the page load time for some heavy query pages from 8 seconds to 0.5 seconds (the second time the page was loaded). Impressive indeed, though the production environment might not see such drastic improvements.
One additional note–you can use query caching for SQLQueries (like group operations) by telling hibernate what the type is of each returned value. If you don’t use addScalar, but you do mark a SQLQuery as cacheable, you’ll get a java.lang.ArrayIndexOutOfBoundsException when that code executes. More here.
These articles were helpful to me as I navigated Hibernate caching, above and beyond the reference documentation: