【问题标题】:set database pulled application constants on startup在启动时设置数据库拉取的应用程序常量
【发布时间】:2013-09-06 14:20:25
【问题描述】:

我的应用程序中有很多下拉菜单。这些下拉菜单的内容是从数据库中读取的。

目前,为了避免每次我想使用这些值时都将它们拉回,我会在第一次需要它们时将它们拉回一次,然后将它们存储在会话中。

这不好。我确实想将它们存储在会话中,因为它们有很多,而且我认为这有点笨拙。我想在理想情况下(假设您不同意)将这些“常量”(它们不是传统常量,但在部署期间不会改变)存储在应用程序范围内,因此它们只需要每次部署从数据库中拉回一次。

我想知道的是,在启动时将这些下拉值存储在应用程序上下文中的方法是什么?

【问题讨论】:

  • 如果你使用 spring 你可以使用缓存抽象:static.springsource.org/spring/docs/3.2.x/…
  • 缓存是最好的方法,特别是如果它们在应用程序中是固定的,每个用户都会建议将范围保持为应用程序级别。从使用 HashMap 到 Coherence Cache,有多种缓存方式,具体取决于您的数据量。
  • 谢谢大家。我将使用 ServletContextListener。 @SotiriosDelimanolis 如果您将其作为更详细的答案发布,我会接受并投票。

标签: servlets constants servlet-listeners


【解决方案1】:

有一个名为ServletContextListener 的接口,它提供了一个连接到您的servlet 上下文初始化的钩子。 ServletContext 是您的应用程序的上下文,即。它的配置。

实现您所描述的一种方法是实现此接口并在web.xml 中注册ServletContextListener 或使用@WebListener 注释类。

contextInitialized() 方法中,您可以提取常量,以任何您需要的方式设置它们,然后将它们作为属性放入ServletContext

@WebListener
public static class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        int someConstant = 42;
        context.setAttribute("myConstant", someConstant);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ...
    }
}

然后,您可以在任何可以访问ServletContext 的地方访问这些常量。

ServletFilter 中,您可以从ServletRequest 获取它

HttpServletRequest request = ....;
request.getServletContext();

如果您想在那里添加更多属性,您还可以通过ServletFilterinit() 方法访问它。

【讨论】:

  • @MasNotsram 欢迎您!还有ServletContainerInitializer 的选项,但我会让你查一下。
  • ServletContainerInitializer 的用途完全不同。 ServletContextListener 非常适合当前形式的具体问题中所述的目的。
  • @BalusC 您不建议使用ServletContainerInitializer 来添加与容器初始化并行的servlet 上下文属性吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多