Coldfusion ORM大表

时间:2009-08-20 01:06:14

标签: orm coldfusion

假如我有一个大型数据集,该表有超过一百万条记录,并且数据库已经标准化,因此外键和东西。我已经正确设置了关系,我得到了第一个对象applications = EntityLoad("entityName")的列表,但由于关系和填充页面需要24秒加载,即使我限制显示的记录数量为5加载需要很长时间。

我的解决方案是创建另一个只获取列表的对象,然后在用户想要的时候,使用具有所有关系的对象并将其显示给用户。这是接近它的正确方法,还是我错过了一个大的ORM概念?

5 个答案:

答案 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可以处理这个问题。

超越这个:

  • 找一些优秀的Hibernate论坛,资源和教程,以便学习Hibernate。这并不像Coldfusion那么多 - > ORM问题就像Hibernate可能会自己做的那样。我已经订购了一些我正在等待的Hibernate书籍,看看它们是怎样的。
  • 同样地,似乎有大量的Hibernate资源,你可以将Hibernate的性能增强解决方案带入Coldfusion领域。我可能会把它变得太简单,但我认为CF-ORM实现是一个包含一些代码生成的包装器,以节省我们的时间。
  • 查看实施过滤器以减少EntityLoad()调用中的数据。
  • 按照其他线程的建议,打开sql logging并查看正在生成的sql。可能不是你需要的机会。查看HQL以查看是否可以形成更好的声明。
  • 最重要的是,分享你找到的东西。我会自愿在这方面做同样的事情,因为你诱惑我在我的业余时间尝试这个比计划早一点。

答案 4 :(得分:1)

费萨尔,我们和Linq(c#orm)碰到了这个。

我们的解决方案是创建不包含关系数据的简单对象。例如,与Users一起,我们有一个SimpleUsers对象,它与任何其他对象几乎没有任何关系,并且列数有限。

可能还有其他方法可以解决这个问题,但这种方法极大地提高了查询速度。