【发布时间】: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