I’m teaching Java EE, especially JPA, Spring and Spring MVC. As I have not so much experience in large projects, it is difficult to know what to present to students about optimisation of ORM.
At the present time, I present some classic optimisation tricks:
- prepared statements (most of ORM implicitely use them by default)
- first and second-level caches
- “write first, optimize later”
- it is possible to switch off ORM and send SQL commands directly to the database for very frequent, specialized and costly requests
Is there any other point the community see about other way to optimize ORM ? I’m especially interested by DAO patterns…
From the point of developer, there are following optimization cases he must deal with:
So I can enlist few more optimizations:
All these cases fit under “write first, optimize later” rule (or “express intention first, optimize later”).
Another well-known optimization-related API is prefetch API (“Prefetch paths“). The idea behind is to fetch a graph of objects that is expected to be processed further with minimal count of queries (or, better, in minimal time). So this API addresses “SELECT N+1” problem. Again, this part is normally expected to be implemented in any serious ORM product.
All above optimizations are safe from the point of transaction isolation – i.e. they don’t break it. Caching-related optimizations normally aren’t safe from this point: you must carefully configure caching to ensure you won’t get stale objects when getting actual content is important (e.g. on security checks or on some real-time interaction). There are lots of techniques here, starting from usage of built-in caches in finishing with integration with distributed caches (memcached, etc.). Any approach solving the problem is good here; personally I would expect an open API allowing to integrate any with cache I prefer.
P.S. I’m a .NET fanboy, as well as one of DataObjects.Net and ORMeter.NET developers. So I don’t know how exactly similar features are implemented in Java, but I’m familiar with the range of available solutions.