我有一个webapp,我需要通过JDBC从DB中检索数据并将其显示在前端。它是一个静态数据,不会改变。所以我只需要检索一次数据并存储在静态变量中,这样我就可以每次都使用该数据而不是查询数据库。以下是示例代码:
public class SampleClass(){
static Map<String, BigDecimal> productMap = null;
public Map<String, BigDecimal> getDatafromDB(Connection conn, PreparedStatement stmt, ResultSet rs) throws SQLException{
if(productMap == null){
productMap = getProductID(conn, stmt, rs);
}
return productMap;
}
public Map<String, BigDecimal> getProductID(Connection conn, PreparedStatement stmt, ResultSet rs) throws SQLException {
logger.debug("retrieving product ID's from product table..");
Map<String, BigDecimal> productMap = new HashMap<String, BigDecimal>();
stmt = conn.prepareStatement("Select * from PRODUCTTABLE");
rs = stmt.executeQuery();
logger.debug("Product ID's retrieved");
while(rs.next()){
productMap.put(rs.getString("PRODUCT_NAME"),rs.getBigDecimal("PRODUCT_ID"));
}
if (stmt != null) {
stmt.close();
}
if (rs != null) {
rs.close();
}
return productMap;
}
}
我通过http servlet请求从UI调用此方法。我第一次运行它时,由于map是null,它会查询数据库并获取数据并将其发送到UI。当我第二次使用新请求再次点击servlet时,产品映射为空,并再次查询数据库并获取数据。由于它是一个静态变量,它应该只在rite初始化一次,所以为什么第二个请求它仍然为null。有人可以更正我的代码吗?
提前致谢
答案 0 :(得分:0)
问题的根本原因是servlet是无记忆的。所以静态变量无济于事。您需要的是会话属性。
我建议您将变量添加为会话属性。首先,您需要创建一个实现Serializable的封装类:
function getAttrFromString(str, node, attr) {
var regex = new RegExp('<' + node + ' .*?' + attr + '="(.*?)"', "gi"), result, res = [];
while ((result = regex.exec(str))) {
res.push(result[1]);
}
return res;
}
var arrayOfImageSrcs = getAttrFromString(
'<img src="http://placekitten.com/350/300"><img src="http://placekitten.com/350/300">',
'img',
'src'
);
现在进入你的servlet:
public class SampleResult implements Serializable {
private Map<String, String> productMap;
public void setProductMap(Map<String, String> productMap) {
this.productMap = productMap;
}
public Map<String, String> getProductMap() {
return productMap;
}
}