嗨,我有 Map 对象,它从 MySQL 表获取其值。该映射在 servlet init()
方法内初始化,以节省许多数据库调用。如果sql表中的值发生变化,我可以在不重新启动Servlet的情况下更新Map对象的值吗?因为init()
方法只被调用一次。我可以为此目的制作一个更新按钮吗?谢谢。
最佳答案
是的,你应该能够。假设您的 servlet 类似于(减去异常(exception))
public class MyServlet extends HttpServlet {
private volatile Map<String, String> properties;
private Object lock = new Object();
public void init() {
properties = ...; // from jdbc call
}
...
}
您将在properties
中有一个可以更改的Map
引用。这里危险的部分是多个线程可能正在访问映射,因此如果您想更改它,您需要将其设置为 volatile
,以便所有线程
都可以看到更改并且您需要同步锁(或使用 Lock
对象),以便 Thread
在进行更改时等待(如果需要)。
例如,您可能有一个执行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
映射现在包含数据库中的新的最新属性(或其他内容)。
关于java - 更新在 init() 内部初始化的 Map 对象以及来自 sql 表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18807291/