【问题标题】:Is it a good idea to store and access an active query resultset in Coldfusion vs re-quering the database?在 Coldfusion 中存储和访问活动查询结果集与重新查询数据库是一个好主意吗?
【发布时间】: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


    【解决方案1】:

    可行吗?是的,根据用户数量和内存中存储的数据量,这可能比再次访问数据库要好得多。

    似乎获得所需单条记录的最佳方法是查询查询。在 CF 中,您可以创建另一个使用现有查询作为数据源的查询。它看起来像这样:

    <cfquery name="subQuery" dbtype="query">
      SELECT *
      FROM  Session.resultset
      WHERE style = #SelectedStyleVariable#
    </cfquery>
    

    请注意,如果您使用的是 CFBuilder,它可能会因为没有数据源而对您发出错误提示,这是 CFBuilder 中的一个错误,如果您的 DBType 是“查询”,则不需要数据源

    【讨论】:

    • 我尝试使用 QoQ,但由于我的初始查询位于使用 cfinvoke 调用的函数内部,因此我总是从头开始,并且无法查询上一个查询,因为它“与 cfinvoke 一起”被丢弃了。这就是为什么我想在 Session 范围内存储查询结果
    【解决方案2】:

    KISS 规则。除非您发现性能确实是一个问题,否则只需重新查询数据库。使用正确的索引,它应该可以很好地扩展。当这是一个问题时,您可以简单地在那里添加查询缓存。

    QoQ 会引入开销(在 CF 端,内存和计算),并可能返回陈旧数据(会话中的查询比 DB 上的查询更旧)。我只在同一个视图上使用同一个查询时才使用 QoQ,而不是在整个 Session 时间跨度内使用。

    【讨论】:

    • 同意。保持简单,除非单个查询实际上是性能问题。在 id 上使用 CF 的内置查询缓存和参数绑定 (cfqueryparam)。
    • 我喜欢 KISS... 现在我也在重新查询(并跳过总记录数查询)。到目前为止一切正常,但我不应该需要的查询,我不应该这样做。
    【解决方案3】:

    根据记录的数量,我要做的是将详细数据存储在应用程序范围内,作为以 ID 为键的结构。比如:

    APPLICATION.products[product_id].product_name
                                    .product_price
                                    .product_attribute
    

    那么您实际上只需要按需查询项目的 ID。

    为了改进“按需”查询,您至少有两个“in code”选项: 1.查询的查询,您查询整个项目集合一次,然后从中查询您需要的数据。 2. Verity 或 SOLR 索引所有内容,然后您只需在刷新搜索集合时查询所有内容。这将比为每个查询执行所有连接要快 吨。

    【讨论】:

    • 我从未真正看过 Verity 和 Solr(还)。我很高兴我通过数据库索引了我的方式并且它或多或少地工作。我不确定是否要将数据加载到应用程序范围内。就是记录太多了。我在想每个用户在他的会话中最多有 24 条记录。“诱发集”。当用户进行搜索时,我存储 24。新搜索或分页替换 24。点击详细信息使用 24 中的 x 加载详细信息视图。我将使用您的语法尝试一下。到目前为止谢谢!
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多