不要使用 servlet 来存储数据。而是将数据存储为ServletContext
。您可以在以下人员的帮助下完成ServletContextListener http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html。相同的侦听器类也可用于在固定时间间隔重新加载数据ScheduledExecutorService http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html.
这是一个启动示例:
public class Config implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
Data data = new Data();
event.getServletContext().setAttribute("data", data);
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Reloader(data), 0, 30, TimeUnit.DAYS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
(请注意,没有TimeUnit.MONTH
,所以这是“每月一次”所能得到的最好结果)
哪里的Reloader
类看起来像这样:
public class Reloader implements Runnable {
private Data data;
public Reloader(Data data) {
this.data = data;
}
@Override
public void run() {
data.reload();
}
}
注册监听器后/WEB-INF/web.xml
如下
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
它将创建Data
实例和执行的单线程调度程序data.reload()
每 30 天一次,您可以访问Data
每个 servlet 中的实例如下:
Data data = (Data) getServletContext().getAttribute("data");
在 JSP 中如下:
${data}