在我的Java Web 应用程序中,我的整个数据库结构都包含在Model classes中。这真的很简洁,因为使用这些模型,我可以非常简单地直接在JSP 页面中从数据库中打印任何内容。请参见以下示例:
<c:if test="${fn:length(author.books) == 0}">The author has no books.</c:if>
<c:forEach items="${author.books}" var="book">
${book.name}
</c:forEach>
模型Author
有一个getBooks()
从数据库中获取相关书籍并返回代表书籍的模型集合的方法。问题是在上面的示例中,该方法实际上被调用了两次,这导致了一个冗余查询。
我知道我可以使用存储值,<c:set />
但首先,我会经常使用它(上面的示例在我的应用程序中很常见),其次,它并不总是有效。例如:
<c:forEach items="${books}" var="book">
${book.author.name}
</c:forEach>
不幸的是,我的数据库不支持连接,因此对于每一行,我都必须运行一个查询以从数据库中获取作者(它实际上非常快,因为作者是memcache
通过键存储的)。假设我想在一页中使用这个循环两次(大菜单和小菜单或其他......)。因此,每个作者都从数据库(或 memcache)中获取了两次,这实际上是不希望的。
我该如何避免呢?理想情况下,JSP“渲染器”应该将每个获取的值存储在一个临时缓存中(仅用于一个请求),并且下次使用这个缓存值而不是再次调用该方法。另一种方法是直接在模型对象中实现此缓存,但我不知道如何在不重写一半代码的情况下有效地做到这一点。有任何想法吗?