首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORM查询结果:数组与包装在Iterator接口中的结果句柄

问ORM查询结果:数组与包装在Iterator接口中的结果句柄
EN

Stack Overflow用户
提问于 2009-02-10 08:55:08
回答 1查看 1.1K关注 0票数 2

好的,这是给专业人士的:

几年来,我一直致力于我自己的PHP ORM/ActiveRecord实现,我将其命名为Pork.dbObject.

它大致上是基于几年前我们都看过的电影“用rails在5分钟内创建自己的站点”。你可以这样做:

代码语言:javascript
复制
$clients = dbObject::Search("Client", array("ID > 500")); 

或

代码语言:javascript
复制
$client = new Client(218); // fetch row with id 218 from client table

或

代码语言:javascript
复制
$projects = $client->Find('Project');

这将从数据库中获取一行或多行,将它们包装在dbObject中并在一个数组中返回它们,或者返回false (没有结果)。

所有这些都在几十个站点和后端完美地工作,但现在我的同事正在使用它来创建一个巨大的日志解析器,这里开始内存使用问题。

他运行的查询可以返回超过20.000行,甚至更多,这当然不是一次包装到对象包装器中并作为单个数组返回的非常好的事情。

显而易见的解决方案是返回一个实现Iterator接口的对象,而不是一个数组。它不应该立即从结果集中获取所有记录,而是只保留生成的数据库查询的结果资源,并在遍历对象时在内部使用mysql_fetch_*,就好像它是一个数组一样。

现在我们来看看我真正的问题:我能不能不出任何问题就这么做?数据库是否能够处理多个打开的结果集,并混合它们并在内存中保留一段时间?

例如,获取20个对象,循环它们,让这20个对象中的每一个获取5个其他对象,依次也获取3个其他对象。这将创建一个循环,其中许多不同的结果句柄将保存在内存中。

我知道我不能序列化这些对象中的任何一个,但是我是否能够在PHP5中顺利地实现这一点,或者数据库接口会给我带来问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-10 09:05:18

这取决于您正在使用的数据库和您的数据库配置。

对于MySQL,您需要确保使用缓冲查询。在PDO中,您可以这样设置它:

代码语言:javascript
复制
$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

这意味着所有数据都将被发送到客户端(与在PHP中获取所有数据不同)。

另一种(可能更糟的)替代方法是,每当您检测到正在运行的查询仍然打开结果集时,就打开一个新的数据库连接。

普通的mysql_query()使用缓冲查询,因此可以处理多个结果集。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/531536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档