  Meeting performance and scalability requirements while delivering services is
a critical issue in web applications. Recently, latency and cost of
Internet-based services are encouraging the use of application-level caching to
continue satisfying users' demands and improve the scalability and availability
of origin servers. Application-level caching, in which developers manually
control cached content, has been adopted when traditional forms of caching are
insufficient to meet such requirements. Despite its popularity, this level of
caching is typically addressed in an ad hoc way, given that it depends on
specific details of the application. Furthermore, it forces application
developers to reason about a crosscutting concern, which is unrelated to the
application business logic. As a result, application-level caching is a
time-consuming and error-prone task, becoming a common source of bugs. Among
all the issues involved with application-level caching, the decision of what
should be cached must frequently be adjusted to cope with the application
evolution and usage, making it a challenging task. In this paper, we introduce
an automated caching approach to automatically identify application-level cache
content at runtime by monitoring system execution and adaptively managing
caching decisions. Our approach is implemented as a framework that can be
seamlessly integrated into new and existing web applications. In addition to
the reduction of the effort required from developers to develop a caching
solution, an empirical evaluation showed that our approach significantly speeds
up and improves hit ratios with improvements ranging from 2.78% to 17.18%.
