2009-02-10 20 views
2

好,這裏是一個親的:ORM查詢結果:比如數組vs結果句柄包裹在Iterator接口

對於幾年了,我一直都在我自己的PHP ORM/ActiveRecord的實現,我命名Pork.dbObject.

它鬆耦合基於「讓自己的網站有5分鐘的軌道」的電影,我們都在幾年前看到的。你可以做這樣的事情:

$clients = dbObject::Search("Client", array("ID > 500")); 

$client = new Client(218); // fetch row with id 218 from client table 

$projects = $client->Find('Project'); 

這會從數據庫中獲取一個或多個行,將它們包裝在一個DBOBJECT和一個返回它們數組,或返回false沒有結果。

所有這一切已經在數十個網站和後端的工作完美,但現在我的同事正在使用它創造了巨大的LOGPARSER並在這裏開始了內存使用的問題..

他跑可以返回在查詢20.000行,甚至更多,這當然不是一件很好的事情,一次全部包裝到一個對象包裝中,並作爲單個數組返回。

顯而易見的解決辦法是將返回實現Iterator接口而不是數組的對象。它不應該立即從結果集中獲取所有記錄,而只需爲生成的數據庫查詢保存結果資源,並在遍歷對象時使用mysql_fetch_ *,就像它是一個數組一樣。

現在,我們得到我真正的問題: 我可以,沒有任何問題,只是這樣做?數據庫能夠處理多個打開的結果集,並將它們混合並保存在內存中一段時間​​?

例如,取20個對象,環它們,讓每一個的這些20取5個他人,至極反過來也它們取3個其他。這將創建一個循環,將許多不同的結果句柄保存在內存中。

我知道我不能序列化這些對象之一,但我將能夠實現這一點沒有在PHP5任何問題,或將數據庫接口給我的問題?

回答

2

這取決於您正在使用的數據庫和數據庫配置。

對於MySQL,您需要確保使用緩衝查詢。在PDO將其設置是這樣的:

$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); 

這意味着所有的數據將被髮送到客戶端(不一樣獲取這一切在PHP)。

另一種(可能更糟糕的)替代方法是,只要檢測到結果集仍處於打開狀態時運行的查詢,就會打開一個新的數據庫連接。

正常mysql_query()使用緩衝查詢,以便將與多個結果集的工作。

+0

謝謝,這正是我要找的。我正在重寫所有內容以便現在使用PDO。 – SchizoDuckie 2009-02-11 08:38:30