【发布时间】:2012-07-13 13:54:23
【问题描述】:
我有一个使用 Coldfusion8 和 MySQL 5.0.88 的产品搜索引擎
产品搜索有两种显示模式:Multiple View和Single View。
Multiple 显示基本记录信息,Single 需要从数据库中轮询其他数据。
现在用户进行搜索,我正在轮询数据库
(a) 总记录和
(b) 记录 FROM 到 TO。
用户总是从他当前的结果集中转到单一视图,所以我的想法是为每个用户存储当前的结果集,而不必再次查询数据库来获取(浪费)总数记录和(浪费 b)我之前已经查询过的单个记录,然后获取单个视图仍然需要的详细信息。
但是,我对此无能为力。
我无法缓存当前的结果集查询,因为它对每个用户(会话)都是唯一的。
查询在我通过 AJAX 调用的 CFC 内的 CFINVOKED 方法中运行,因此整个查询运行,然后 CFC 和 CFINVOKE 方法被丢弃,所以我不能使用查询或 variables.cfc_storage 的查询。
所以我的想法是将当前结果集存储在 Session 范围内,它将随着用户运行的每次新搜索(分页或全新搜索)而更新。存储的最大结果将是显示的结果数。
我可以存储查询,使用:
<cfset Session.resultset = query_name>
这会将整个查询与结果一起存储,如下所示:
query
CACHED: false
EXECUTIONTIME: 2031
SQL: SELECT a.*, p.ek, p.vk, p.x, p.y
FROM arts a
LEFT JOIN p ON
...
LEFT JOIN f ON
...
WHERE a.aktiv = "ja"
AND
... 20 conditions ...
SQLPARAMETERS: [array]
1) ... 20+ parameters
RESULTSET:
[Record # 1]
a: true
style: 402
price: 2.3
currency: CHF
...
[Record # 2]
a: true
style: 402abc
...
每次用户进行新搜索时,这都会被覆盖。但是,如果用户想查看其中一项的详细信息,我不需要查询(记录总数和获取一条记录)是否可以从我的临时存储中访问我需要的记录。这样,我将节省两次数据库行程,每次都值得 2031 执行时间来获取我之前已经提取的数据。
折衷方案是每个用户在 Session.scope 中拥有最多 48 个结果(每页的最大项目数)的结果集。
我的问题:
1. 这是可行的还是我应该重新查询数据库?
2.如果我有一个像上面这样的结构/数组/对象,我如何通过样式编号从中挑选我需要的记录=我如何访问结果集?我不能只循环存储的查询(现在尝试了一段时间......)。
感谢您的帮助!
【问题讨论】:
标签: session coldfusion resultset