我有两个对象
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>
因此,我有多个homeFeatures,每个都有一个与之关联的媒体项。相同的媒体项可以与多个homeFeatures相关联,但每个homeFeature只能有一个由homeFeatures.mediaid连接的媒体项。
如果我执行了一个entityLoad(“homeFeatures”),我将获得homeFeatures的1个查询和homeFeatures中每个行的媒体表的1个查询。换句话说,这是N + 1问题。为什么?这应该是两个查询总数,一个用于获取所有homeFeatures,另一个用于获取由homeFeatures确定的列表中所有媒体ID的媒体。我正试图按照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问题。
有什么想法吗?请帮忙!
答案 0 :(得分:0)
在这种情况下,解决方案是batchsize
。通过在cfc或cfproperty上指定,我们可以设置批量大小,以便相关项目按组进行批处理,而不是单独进行。