更新在init()中初始化的Map对象和来自sql表的值

时间:2013-09-14 23:10:42

标签: java mysql servlets map

嗨我有Map对象从MySQL表中获取其值。此映射在servlet init()方法内初始化,以便保存许多数据库调用。如果sql表中的值发生更改,我可以更新Map对象的值而不重新启动Servlet,因为init()方法只调用一次。我可以为此目的制作更新按钮吗?感谢。

1 个答案:

答案 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映射现在保存数据库中新的最新属性(或其他)。