嗨,我有Map,它从MySQL表中获取它的值。该映射在servlet init()方法中进行初始化,以保存许多数据库调用。如果sql表中的值发生了变化,我可以在不重新启动Servlet的情况下更新Map对象的值,因为init()方法只被调用一次。我可以为此做一个更新按钮吗?谢谢。
发布于 2013-09-15 13:06:51
是的,你应该可以。假设您的servlet类似于(减去异常)
public class MyServlet extends HttpServlet {
private volatile Map<String, String> properties;
private Object lock = new Object();
public void init() {
properties = ...; // from jdbc call
}
...
}您将在Map中拥有一个可以更改的properties引用。这里的危险之处在于,多个线程可能正在访问映射,因此如果您想要更改它,您需要使它成为volatile,以便所有Thread都可以看到更改,并且需要在锁上同步(或使用Lock对象),以便在进行更改时Thread等待,如果需要的话。
例如,您可能有一个执行update的POST按钮。你的doPost()会像这样
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> newProperties = ...; // get new map from jdbc call
synchronized (lock) {
properties = newProperties;
}
}就是这样。properties映射现在保存数据库中的新的最新属性(或任何其他属性)。
https://stackoverflow.com/questions/18807291
复制相似问题