Yes, the caching at the API layer has proven critical for us, too. Although, of course, this introduces a cache coherency problem, and we all know what fun those can be.
You bring up a very good point that I left out:
The few exceptions include data that are involved in transactional contexts...
It's sad how few people even understand how to write transactional code when you hand them a direct interface to SQL. (I like to think I do, but I may be fooling myself.) And trying to implement, document, test, and maintain a stateless RESTful HTTP protocol that properly supports transactions on the underlying data store is even harder.
You bring up a very good point that I left out:
The few exceptions include data that are involved in transactional contexts...
It's sad how few people even understand how to write transactional code when you hand them a direct interface to SQL. (I like to think I do, but I may be fooling myself.) And trying to implement, document, test, and maintain a stateless RESTful HTTP protocol that properly supports transactions on the underlying data store is even harder.