gpt4 book ai didi

java - 更新在 init() 内部初始化的 Map 对象以及来自 sql 表的值

转载 作者:行者123 更新时间:2023-11-29 13:35:33 27 4
gpt4 key购买 nike

嗨,我有 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com