gpt4 book ai didi

java - 正确设置简单的服务器端缓存

转载 作者:行者123 更新时间:2023-11-30 05:10:29 27 4
gpt4 key购买 nike

我正在尝试正确设置服务器端缓存,并且正在寻求对我当前设置的建设性批评。缓存在 Servlet 启动时加载,并且不再更改,因此实际上它是只读缓存。显然,它需要在 Servlet 的生命周期内保留在内存中。这是我的设置方法

private static List<ProductData> _cache;
private static ProductManager productManager;

private ProductManager() {
try {
lookup();
} catch (Exception ex) {
_cache = null;
}
}

public synchronized static ProductManager getInstance() {
if (productManager== null) {
productManager= new ProductManager();
}
return productManager;
}

缓存由 Servlet 设置如下:

private ProductManager productManager;

public void init(ServletConfig config) throws ServletException {
productManager = ProductManager.getInstance();
}

最后,这就是我访问它的方式:

public static ProductData lookup(long id) throws Exception {
if (_cache != null) {
for (int i = 0; i < _cache.size(); i++) {
if (_cache.get(i).id == id) {
return _cache.get(i);
}
}
}

// Look it up in the DB.
}

public static List<ProductData> lookup() throws Exception {
if (_cache != null) {
return _cache;
}

// Read it from the DB.

_cache = list;
return list;
}

最佳答案

你做得很艰难。单例风格的模式是完全没有必要的。只需实现 ServletContextListener在 web 应用程序启动(和关闭)时 Hook ,以便您可以在 web 应用程序启动期间在应用程序范围中加载和存储数据。

public class Config implements ServletContextListener {

private static final String ATTRIBUTE_NAME = "com.example.Config";
private Map<Long, Product> products;

@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext();
context.setAttribute(ATTRIBUTE_NAME, this);
String dbname = context.getInitParameter("dbname");
products = Database.getInstance(dbname).getProductDAO().map();
}

@Override
public void contextDestroyed(ServletContextEvent event) {
// NOOP.
}

public static Config getInstance(ServletContext context) {
return (Config) context.getAttribute(ATTRIBUTE_NAME);
}

public Map<Long, Product> getProducts() {
return products;
}

}

您在web.xml中注册如下:

<listener>
<listener-class>com.example.Config</listener-class>
</listener>

这样您就可以在任何 servlet 中获取它,如下所示:

Config config = Config.getInstance(getServletContext());
Map<Long, Product> products = config.getProducts();
// ...

关于java - 正确设置简单的服务器端缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551615/

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