Is it really useful to cache entities in any but trivial applications?

The question often arises because some users believe that caching assumes your server "owns" the underlying data which, in practice, will rarely (if ever) be true. A stored procedure in your database becomes shared. Also, when you want to cluster, you must share underlying data.

But caching does not necessarily need to assume exclusive ownership. There are several applications which can work on an "optimistic concurrency" basis. This sort of design works for many applications where concurrency collisions are rare. It can fail miserably, particularly from the user's viewpoint, when concurrency collisions are probable. But such applications are likely to require a more sophisticated design under any architecture.