【问题标题】:One-to-One or Many-to-One with CF9 ORM in 2 queries在 2 个查询中使用 CF9 ORM 进行一对一或多对一
【发布时间】:2011-09-14 00:09:21
【问题描述】:

我有两个对象

HomeFeatures
<cfcomponent persistent="true">
    <cfproperty name="id" column="homeFeatureid">
    <cfproperty name="tabTitle">
    <cfproperty name="title">
    <cfproperty name="description">
    <cfproperty name="sort">
    <cfproperty name="moretext">
    <cfproperty name="url">
    <cfproperty name="active">
    <cfproperty name="media" fieldtype="many-to-one" fkcolumn="mediaid" cfc="media" lazy="false" fetch="join" missingrowIgnored="true">
</cfcomponent>

Media
<cfcomponent persistent="true" table="cms.dbo.media">
    <cfproperty name="id" column="mediaid">
    <cfproperty name="filename">
</cfcomponent>

因此,我有多个 homeFeature,每个都有与之关联的媒体项目。同一个媒体项目可以与多个 homeFeature 相关联,但每个 homeFeature 只能有一个由 homeFeatures.mediaid 连接的媒体项目。

如果我执行 entityLoad("homeFeatures"),我将获得 1 个 homeFeatures 查询和 1 个媒体表查询,用于 homeFeatures 中的每一行。换句话说,这是 N+1 问题。为什么?这应该是总共两个查询,一个获取所有 homeFeatures,一个获取所有媒体 ID 在 homeFeatures 确定的列表中的媒体。我正在尝试按照http://www.rupeshk.org/blog/index.php/2009/09/coldfusion-orm-performance-tuning-fetching-strategy/ 和 adobe 文档中的定义进行“急切”加载。

在这个特定的视图中,我需要访问每个条目的媒体记录,这就是我将惰性设置为 false 的原因。我发誓我已经尝试过lazy=false|true、batch=999、fieldtype=one-to-one|many-to-one、fetch=join|select 的每一次迭代,它们都产生了相同的 N+1 问题。

有什么想法吗?请帮忙!

【问题讨论】:

  • 所以fetch="join" 仍然可以从子对象中获得很多SELECTs?您是否确保在对对象进行更改后运行了ORMReload()
  • 由于这是一个调试平台,我在onRequestStart() 中有ormReload()。此外,我为每个父对象获取一个 select 语句,因此日志为每个父 DB 行重复 select filename FROM media WHERE mediaid = (parents mediaid) 一次。
  • 我在 iPad 上,明天才能给你答案。坚持下去,不要做任何不切实际的事情。

标签: sql hibernate orm coldfusion coldfusion-9


【解决方案1】:

在这种情况下,解决方案是batchsize。通过在 cfc 或 cfproperty 上指定,我们可以设置批量大小,以便相关项目成组批处理,而不是单独批处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多