[英]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 EqualsBuilder和HashCodeBuilder ):
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>
。
在代碼中,檢查參數service
和webdomain
不為null和有效后,您將使用這些參數創建TextsParam
實例,並檢查地圖是否已包含該鍵。 如果是,請使用相應的TextsResult
值。 否則,請執行數據庫查詢並將結果存儲到您的地圖中以備后用。 不要忘記將代碼放入synchronized
塊(或更好的同步方法)中。
請注意,添加到地圖的條目將永遠不會被刪除。 因此,這僅適用於可管理值的可管理大小。 下一步將是使用Map
實現,該實現將自動刪除舊值,例如LRU緩存 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.