如何将从数据库中检索的数据存储到变量中,以便我可以避免再次访问数据库

时间:2017-02-26 05:45:01

标签: java jdbc static static-methods

我有一个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。有人可以更正我的代码吗?

提前致谢

1 个答案:

答案 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;
    }
}