ORM Sorgu sonuçları: Iterator arayüzü sarılmış Sonucu kolu vs Diziler

1 Cevap php

Tamam, burada yanlısı için bir tane:

Şimdi birkaç yıl için, ben Pork.dbObject. adlı benim kendi PHP ORM / ActiveRecord uygulama üzerinde çalışıyoruz

Bu loosly dayanıyveyahepimiz birkaç yıl önce gördüm filmi '5 dakikalık raylar ile kendi sitesi yapmak'. Sen gibi şeyler yapabilirsiniz:

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

veya

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

veya

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

This will fetch one veyamore rows from the database, wrap them in a dbObject and return them in one array, veyareturn false of there are no results.

Tüm bu siteler ve backendleri onlarca mükemmel çalışıyor, ama şimdi benim meslektaşım çok büyük bir LOGPARSER oluşturmak için kullanıyor ve burada bellek kullanım sorunları başlar ..

O çalışan sorguları tabii bir kerede bir nesne sargı içine sarın ve bir tek dizi olarak geri dönmek için çok iyi bir şey değil, daha belki, 20.000 satır üzerinde dönebilirsiniz.

The obvious solution would be to return an object that implements the Iterator interface instead of an array. It shouldn't instantly fetch all the records from the resultset, but just hold the result resource fveyathe generated database query and use mysql_fetch_* internally when you traverse the object as if it was an array.

Now we get to my real question: Can I, without any problems just do this? Are databases able to handle multiple open resultsets, and mix them and keep them in memory fveyaa while?

Fveyaexample, fetch 20 objects, loop them, let each of these 20 fetch 5 others, wich in their turn also fetch 3 others. This would create a loop where a number of different result handles will be kept in memory.

I know i can't serialize one of these objects, but will i be able to implement this without any problems in PHP5, veyawill database interfaces give me problems?

1 Cevap

Bu kullanarak ve veritabanı yapılandırma olduğunuz veritabanı bağlıdır.

MySQL için size tamponlu sorguları kullanmak emin olmak gerekir. PDO'de Eğer bu şekilde ayarlayın:

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

Bu, tüm veriler istemci (PHP tüm getiriliyor gibi aynı değil) gönderilir olacağı anlamına gelir.

Diğer (muhtemelen kötü) bir alternatif hala açık bir sonuç kümesi ile yürütülüyor bir sorgu algılamak her yeni veritabanı bağlantısını açmak.

Birden çok sonuç kümeleri ile çalışacak, böylece, normal mysql_query() , bir tamponlu sorgu kullanır.