嗨我有Map对象从MySQL表中获取其值。此映射在servlet init()
方法内初始化,以便保存许多数据库调用。如果sql表中的值发生更改,我可以更新Map对象的值而不重新启动Servlet,因为init()
方法只调用一次。我可以为此目的制作更新按钮吗?感谢。
答案 0 :(得分:1)
是的,你应该可以。假设您的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
映射现在保存数据库中新的最新属性(或其他)。