我是否可以拥有下拉数据缓存,而不是每次请求都从DB获取?

时间:2011-09-26 16:50:42

标签: jsp

我正在使用数据库存储过程填充三个下拉菜单。每次调用页面时,它都会执行存储过程并填充下拉列表。这样做需要花费很多时间。有没有其他方法可以拥有数据缓存并可以使用它而不是执行存储过程?

1 个答案:

答案 0 :(得分:2)

将其存储在应用程序或会话范围中。假设这些下拉列表代表应用程序范围的常量,那么您可以使用ServletContextListener。它只能在webapp的启动时执行一次。

E.g。

@WebListener
public class ApplicationDataConfigurator implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        Map<String, String> countries = populateAndGetItSomehow();
        event.getServletContext().setAttribute("countries", countries);
        // ...
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP.
    }

}

ServletContext属性也以JSP EL通常的方式提供:

<select name="countries">
  <c:forEach items="${countries}" var="country">
    <option value="${country.key}">${country.value}</option>
  </c:forEach>
</select>

如果您更愿意将其存储在会话中,那么请使用预处理servlet代替doGet()检查它们是否已存在于当前会话中,然后填充它。您只需要意识到,当涉及大数据时,这可能会影响总内存使用量。