Session 与重新查询数据库相比,在Coldfusion中存储和访问活动查询结果集是一个好主意吗?

Session 与重新查询数据库相比,在Coldfusion中存储和访问活动查询结果集是一个好主意吗?,session,coldfusion,resultset,Session,Coldfusion,Resultset,我有一个使用Coldfusion8和MySQL 5.0.88的产品搜索引擎 产品搜索有两种显示模式:多视图和单视图 Multiple显示基本记录信息,Single需要从数据库轮询其他数据 现在,一个用户进行搜索,我正在轮询数据库以查找 a记录和记录总数 b记录从到 用户总是从其当前结果集转到单个视图,因此我的想法是为每个用户存储当前结果集,而不必再次查询数据库以获得总记录数,并获得我以前查询过的单个记录,然后获得单个视图仍然需要的详细信息 然而,我没有任何进展 我无法缓存当前的resultset

我有一个使用Coldfusion8和MySQL 5.0.88的产品搜索引擎

产品搜索有两种显示模式:多视图和单视图

Multiple显示基本记录信息,Single需要从数据库轮询其他数据

现在,一个用户进行搜索,我正在轮询数据库以查找

a记录和记录总数 b记录从到

用户总是从其当前结果集转到单个视图,因此我的想法是为每个用户存储当前结果集,而不必再次查询数据库以获得总记录数,并获得我以前查询过的单个记录,然后获得单个视图仍然需要的详细信息

然而,我没有任何进展

我无法缓存当前的resultset查询,因为它对于每个usersession都是唯一的

查询在我通过AJAX调用的CFC中的CFCalled方法中运行,因此整个查询都会运行,之后CFC和CFINVOKE方法会被丢弃,因此我不能使用查询或变量的查询。CFC\u存储

因此,我的想法是将当前结果集存储在会话范围中,每次新的搜索都会更新结果集,用户可以运行分页或全新的搜索。存储的最大结果数为显示的结果数

我可以使用以下方法正确存储查询:

 <cfset Session.resultset = query_name>
每次用户进行新的搜索时,都会覆盖此内容。但是,如果用户希望查看其中一项的详细信息,我不需要查询记录总数&如果我可以从临时存储器访问所需的记录,就可以获得一条记录。通过这种方式,我将节省两次数据库访问,每次访问值为2031执行时间,以获取我之前已经提取的数据

折衷的办法是,每个用户在Session.scope中的结果集最多为48个结果,每页的最大项目数

我的问题是: 1.这是可行的还是我应该重新查询数据库? 2.如果我有一个像上面那样的结构/数组/对象,我如何通过style number=我如何访问resultset从中选择我需要的记录?我不能只是在存储查询上循环,我已经尝试了一段时间了


谢谢你的帮助

可行吗?是的,这取决于它在内存中存储了多少用户和多少数据,可能比再次访问数据库要好得多

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

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

请注意,如果您使用的是CFBuilder,它可能会因为您没有数据源而向您发出错误的尖叫,这是CFBuilder中的一个错误,如果您的DBType是query,则不需要有数据源。只需重新查询数据库,除非您发现性能确实存在问题。有了正确的索引,它应该可以很好地伸缩。当问题出现时,您可以简单地在那里添加查询缓存


QoQ将在CF端、内存和计算方面引入开销,并且可能返回陈旧数据,其中会话中的查询比数据库中的查询旧。我只在同一视图上使用同一查询时使用QoQ,而不是在整个会话时间跨度内使用QoQ。

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

APPLICATION.products[product_id].product_name
                                .product_price
                                .product_attribute
然后,您实际上只需要按需查询项目的ID

为了改进随需应变查询,您至少有两个代码内选项: 1.查询的查询,其中您可以查询整个项目集合一次,然后从中查询所需的数据。
2.Verity或SOLR为所有内容编制索引,然后在刷新搜索集合时只需查询所有内容。这比为每个查询执行所有联接要快很多。

Agree。保持简单,除非单个查询实际上是一个性能问题。在id上使用CF的内置查询缓存和参数绑定cfqueryparam。我喜欢KISS。。。现在我也在重新查询并跳过记录总数查询。到目前为止还可以,但我不需要,也不应该这样做。我尝试使用QoQ,但由于我的初始查询位于使用cfinvoke调用的函数中,所以我总是从scrath开始,无法查询上一个查询,因为它与cfinvoke一起被丢弃。这就是为什么我想知道如何将查询结果存储在会话范围中,我还没有真正研究过Verity和Solr。我很高兴我在数据库中建立了索引,它或多或少能正常工作。我不确定是否要将数据加载到应用程序范围中。只是记录太多了。我想每个用户在他的会话集中最多有24条记录。当用户进行搜索时,我存储24。新的搜索或分页将取代24。点击细节使用x从24加载细节视图。 我将使用您的语法尝试一下。到目前为止,谢谢!
APPLICATION.products[product_id].product_name
                                .product_price
                                .product_attribute