簡體   English   中英

JSP臨時存儲重復數據庫結果

[英]JSP Temporary storing Repetitive Database Results

我在JSP中有以下代碼,每次用戶訪問該頁面時,該代碼都會重復運行。 所有訪客的數據庫結果值均相同。 該頁面接受參數“ service”,並基於該參數執行SQL查詢。 基於第一個查詢生成的“ id”執行第二個SQL查詢。 如果有20種不同的服務,它將運行以下查詢20次,然后僅顯示該頁面。 因此,有什么方法可以臨時存儲這些結果(使用緩存或其他方法),使得這些查詢僅運行一次/第一次訪問,然后針對其他請求不進行數據庫請求? 這樣頁面加載速度非常快,並且不占用任何CPU /內存。.我只能在JSP中執行此操作,並且要使用apache tomcat 6。

 ================= EDITED PART================

我通過實現application.getAttribute()/ setAttribute()的說法找到了第一個解決方案。

 if(application.getAttribute(service)==null
 {
    //do first query
    application.setAttribute(service,name);
 } 
else name=application.getAttribute(service);

現在如何在第二個查詢中使用id參數? 請指教..

=============================================

String service=request.getParameter("service");

sqlstr = "SELECT uniqueid,name,body FROM tbl_texts WHERE 
serviceunique='"+service+"' AND webdomain='" + webdomain + "'";

  rs = DbUtils.getRs(con,sqlstr);
  if (rs.next()) {
  id = rs.getString("uniqueid");
  name = rs.getString("name");
  body=rs.getString("body");

  }
  rs.close();


  sqlstr = "SELECT animage,awidth,aheight FROM tbl_Images WHERE 
  uniqueid='" + id + " AND profile='" + imageprofile + "'";
   rs = DbUtils.getRs(con,sqlstr);
   if (rs.next()) {
    images = rs.getString("animage");
     size= (int)  (rs.getDouble(awidth) * rs.getDouble(rs.getDouble(aheight) )
   rs.close();

提前致謝!

首先,不要使用字符串連接來構建您的SQL查詢。 使用准備好的語句。 這是一個安全漏洞,沒有任何理由錯過這一點。

然后警告,在JSP頁面內使用Java代碼被認為是不好的風格。 這可能會導致代碼無法維護。 在大多數情況下,最好遵守該規則。 但是要現實一些,有時在某些情況下最好打破該規則。 負責任的開發人員應權衡利弊后再決定。

如果您決定將Java寫入您的JSP,請正確執行。 為安全起見,請使用准備好的語句,驗證您的輸入參數(1000個字符或空ID是否為有效ID?)並同步並發訪問。

作為窮人的緩存,您可以使用簡單的Map實例(每個SQL查詢可能一個),並將地圖存儲到應用程序范圍內。 使用同步來訪問和更改這些地圖。

為每個映射創建一個參數類和一個結果類。

例如(使用Apache Commons Lang EqualsBuilderHashCodeBuilder ):

class TextsParam {
  private String service;
  private String webdomain;

  // Getters and setters ...

  @Override 
  public boolean equals(Object obj) {
    if(obj == null) { return false; }
    if(obj == this) { return true; }
    if(obj.getClass() != getClass()) {
      return false;
    }
    TextsParam other = (TextsParam) obj;
    return new EqualsBuilder()
             .appendSuper(super.equals(obj))
             .append(service, other.service)
             .append(webdomain, other.webdomain)
             .isEquals();
  }

  @Override
  public int hashCode() {
    // you pick a hard-coded, randomly chosen, non-zero, odd number
    // ideally different for each class
    return new HashCodeBuilder(17, 37)
        .append(service)
        .append(webdomain).
        .toHashCode();
  }

}

class TextsResult {
  private String id;
  private String name;
  private String body;

  // Getters and setters ...
}

然后,您的第一個地圖可能是Map<TextsParam, TextsResult>

在代碼中,檢查參數servicewebdomain不為null和有效后,您將使用這些參數創建TextsParam實例,並檢查地圖是否已包含該鍵。 如果是,請使用相應的TextsResult值。 否則,請執行數據庫查詢並將結果存儲到您的地圖中以備后用。 不要忘記將代碼放入synchronized塊(或更好的同步方法)中。

請注意,添加到地圖的條目將永遠不會被刪除。 因此,這僅適用於可管理值的可管理大小。 下一步將是使用Map實現,該實現將自動刪除舊值,例如LRU緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM