gpt4 book ai didi

java - JSP 临时存储重复数据库结果

转载 作者:搜寻专家 更新时间:2023-10-30 20:41:47 25 4
gpt4 key购买 nike

我在 JSP 中有以下代码,每次用户访问该页面时都会重复运行。所有访问者的数据库结果值都相同。该页面采用参数“service”,并基于它执行 SQL 查询。第二个 SQL 查询是根据第一个查询生成的“id”执行的。如果有 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 查询一个)并将映射存储到应用程序范围内。使用同步来访问和更改这些 map 。

为每个 map 创建一个参数类和一个结果类。

例如(使用 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 的类型可能是 Map<TextsParam, TextsResult> .

在您的代码中,在您检查参数 service 之后和 webdomain不为空且有效,您创建一个 TextsParam使用这些参数实例并检查您的 map 是否已包含该键。如果是,使用对应的TextsResult值(value)。否则执行数据库查询并将结果存储到 map 中供以后使用。不要忘记将该代码放入 synchronized block (或更好的同步方法)。

请注意,添加到 map 中的条目永远不会被删除。因此,这仅适用于可管理的可缓存值大小。下一步是使用 Map自动删除旧值的实现,如 LRU cache .

关于java - JSP 临时存储重复数据库结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com