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

标签 java mysql servlets dictionary

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

相关文章:

java - 返回 boolean 语句的关键字

java - 修改端点以接收 XML 文件

java - 如何将查询的结果集转换为可以进一步解析以创建 json 的 pojo 类?

mysql - key 'PRIMARY' 的重复条目 [...]

java - 正确从隐藏类型获取值的方法

java - 在 Java 中使用 servlet 获取 boolean 值 isAdmin 值

java - 使用 edittext 在 ListView 中搜索

php - 如何保护网站免受批量抓取/下载?

mysql - 在 mySQL 中使用 group by 后获取最新日期

servlets - 更改 Glassfish Servlet 编码/字符集