2017-02-26 37 views
0

我有一个web应用程序,需要通过JDBC从数据库中检索数据并将其显示在前端。它是一个静态数据,它不会被改变。所以我只需要一次检索数据并存储在一个静态变量中,这样我就可以每次使用这些数据而不是查询数据库。以下是示例代码:如何将从数据库检索到的数据存储到变量中,以便我可以避免再次触击数据库

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

    } 

我从UI通过http servlet请求调用此方法。我第一次运行它时,由于地图为空,它会查询数据库并获取数据并将其发送到UI。当我用新的请求第二次再次访问servlet时,产品地图为空,并再次查询数据库并获取数据。由于它是一个静态变量,它应该只被初始化一次,为什么它仍然为第二个请求为空。有人可以纠正我的代码吗?

在此先感谢

+0

您需要向我们展示了'retreivedatafromDB()'方法 –

+0

而如果别人在你的方法调用之间更新数据库?缓存一些数据库数据没有意义 –

+0

缓存是一种技术,您可能不得不使用它,并且如果想要填充静态初始化程序,也可以考虑使用静态初始化程序!该类只能加载一次! –

回答

0

您的问题的根本原因是一个servlet是无记忆的。所以一个静态变量将无济于事。你需要的是一个会话属性。

我建议添加你的变量作为会话属性。首先,你需要创建一个实现Serializable接口的封装类:在你的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; 
    } 
} 

现在:

HttpSesssion session = request.getSession(); 

Map<String, String> productMap; 
SampleResult result; 

if (session.getAttribute("productMap") == null) { 
    productMap = retrievedatafromDB(); 
    result = new SampleResult(); 
    sampleResult.setProductMap(productMap); 
    session.setAttribute("productMap", result);// session attribute created 
} else { 
    result = session.getAttribute("productMap");// retrieve session attribute 
    productMap = result.getProductMap(); 
} 
+0

这仅在该产品图符合用户/会话特定时才有用。我的猜测是,OP希望产品图是应用范围,而不是会话。 –

+0

感谢您的建议,但是Mark表示我希望产品地图成为应用程序范围而不是会话范围。 – RRN

相关问题