2017-02-26 12 views
0

DBからJDBCを介してデータを取得してフロントエンドに表示する必要のあるWebアプリケーションがあります。その静的なデータは変更されません。ですから、データを一度だけ取得し、静的変数に格納するだけで済み、データベースを照会する代わりに毎回そのデータを使用することができます。以下はサンプルコードですデータベースから取り出されたデータを変数に格納する方法。

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サーブレットリクエストを通じて呼び出しています。初めて実行するときは、マップがヌルであるため、データベースに照会してデータを取得し、UIに送信します。新しいリクエストでもう一度サーブレットにヒットしたとき、プロダクト・マップはnullであり、再びデータベースに照会してデータを取得しています。静的な変数なので、一度riteで初期化する必要があります。なぜなら、なぜ2番目のリクエストでもまだnullであるからです。誰かが私のコードを修正してもらえますか?事前

+0

あなたは私たちを表示する必要が 'retreivedatafromDB()'メソッド –

+0

そして、何であれば他の誰かメソッド呼び出し間でデータベースを更新しますか? –

+0

キャッシングはあなたが使用しなければならないかもしれないテクニックであり、静的なマップを埋めたい場合は、代わりに静的なイニシャライザを使用することも考えられます。クラスは一度だけロードする必要があります! –

答えて

0

おかげで、あなたの問題の根本的な原因は、サーブレットがメモリレスであることです。したがって、静的変数は役に立ちません。必要なのはセッション属性です。

あなたの変数をセッション属性として追加することをお勧めします。サーブレットで今

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

:最初の場所では、Serializableを実装カプセル化するクラスを作成する必要があり

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

これは、その製品マップがユーザー/セッション固有のものである場合にのみ有用です。私の推測では、営業担当者はその製品マップをセッションではなくアプリケーションスコープにしたいと考えています。 –

+0

提案していただきありがとうございますが、マークとして、私は製品の地図をセッションスコープではなくアプリケーションスコープにします。 – RRN