假如我有一个大型数据集,该表有超过一百万条记录,并且数据库已经标准化,因此外键和东西。我已经正确设置了关系,我得到了第一个对象applications = EntityLoad("entityName")
的列表,但由于关系和填充页面需要24秒加载,即使我限制显示的记录数量为5加载需要很长时间。
我的解决方案是创建另一个只获取列表的对象,然后在用户想要的时候,使用具有所有关系的对象并将其显示给用户。这是接近它的正确方法,还是我错过了一个大的ORM概念?
答案 0 :(得分:5)
您是在计算获取数据的时间,还是您可能正在对其进行CFDUMP或视觉上可能很慢的其他内容。换句话说,你是否已将EntityLoad包装在cftimer标签中,以确保它是罪魁祸首?
答案 1 :(得分:2)
我要做的第一件事是在Application.cfc中启用SQL日志记录。将logSQL = true添加到This.ormSettings。
这应该允许您获取ORM生成的SQL。在分析仪中运行它。看看ORM SQL是不是疯了。看看它是你错过的索引还是什么。
你也在做Ray的谈话:http://www.coldfusionjedi.com/index.cfm/2009/8/14/Simple-ColdFusion-9-ORM-Paging-Demo?
如果没有尝试使用ORMExecuteQuery和HQL来启用分页。
这些是我的想法。
答案 2 :(得分:2)
使用Hibernate定义复杂域模型时 - 有时需要调整映射以提高性能。如果您正在处理继承(不确定模型中有多少继承),则尤其如此。最终目标是让您的查询从尽可能少的表中提取,同时仍然保留您的域模型。这可能需要使用高级继承映射(在一秒内更多)。
记录SQL
正如Terry所提到的,您将需要确保您可以记录传递给您的数据库的实际SQL(是的,您不会完全脱离使用ORM的SQL)。这是一篇关于在Rupesh中为CF9中的Hibernate设置日志记录的好文章:
http://www.rupeshk.org/blog/index.php/2009/07/coldfusion-orm-how-to-log-sql/
HIBERNATE MAPPING FILES
无论何时你想要做一些超出基本的事情,你都要确保你正在查看为你的CFC生成的实际Hibernate映射文件。请务必使用Application.cfc中的所有休眠选项设置以下内容:
savemapping = true
虽然cfproperty属性允许您定义映射的许多方面,但实际上有些事情只能在Hibernate映射文件中完成(并且有很多社区资源。
继承映射
正如我前面提到的,Hibernate为映射提供了不同的继承策略。它们是每个层次结构的表,每个子类的表,每个具体类的表和隐式多态。您可以在高级映射>下的CF9文档中阅读有关这些类型的更多信息。继承映射或在Hibernate文档中(因为它将永远解释每一个)。
了解表的映射方式对于继承非常重要(如果不调整设置,Hibernate也可以生成一些巨大的查询)。
这些是我能想到的 - 如果您可以提供有关您的域模型的其他信息 - 我们可以查看可以做些什么来调整它。
答案 3 :(得分:1)
Hibernate很有可能正在进行缓存。我心中的公平比较(每个人都可以随意添加)正在做:
EntityLoad(“entity_name”)与执行 select * from TABLE 相同
因此,在这种情况下,Hibernate在实例化内存时可能会做什么,并以某种方式对其进行缓存,当您发送如此广泛的SQL指令时,数据库服务器可能会这样做。
过去几周我一直对ORM非常感兴趣,看起来这是一项非常有益的事业。
出于这个原因,你是否会因此加载所有500,000条记录?我假设没有。
我有一个大型日志记录表,我将攻击,我发现SQL好东西必须在那里。例如,标记索引的字段,这将在搜索时加快速度。我确信ORM可以处理这个问题。
超越这个:
答案 4 :(得分:1)
我们的解决方案是创建不包含关系数据的简单对象。例如,与Users一起,我们有一个SimpleUsers对象,它与任何其他对象几乎没有任何关系,并且列数有限。
可能还有其他方法可以解决这个问题,但这种方法极大地提高了查询速度。