2

私は PHP と Propel の初心者です。

私が読んだように、Propel はクエリを再利用するためにインスタンス プールを取得しました。

例えば

    <?php
// first call
$author1 = AuthorQuery::create()->getByFooField('foo');
$foo = $author1->getId();
// SELECT query
...
// second call
$author2 = AuthorQuery::create()->getByFooField('Foo');
// Skips the SQL query and returns the existing $author1 object
$foo = $author2->getId();

その事は

このオブジェクトは何回生きていますか? これは、Excel を解析し、いくつかのオブジェクトを作成してデータベースに永続化する必要があるためです。

したがって、100 行で読み取った Excel では、「foo」を 25 回読み取った可能性があります。したがって、24 回のクエリを回避できれば、PK を取得するために毎回データベースにクエリを実行するのは悪いことです。

Instance Propel がこの問題を解決しているように見えますが、何回分かはわかりません。

それは、時間、使用されるメモリ、またはクエリが実行されるスコープのようなものに依存しますか? (つまり、おそらく最初のクエリを実行するメソッドの後、インスタンス プールがクリアされるため、2 番目のクエリが同じメソッド内にない限り、db に再度クエリを実行します。または、オブジェクトが生きている間は実行しません。知りません)

私は少し検索しましたが、何も見つかりませんでした.私の直感は、使用されているメモリに依存することを教えてくれますが、公式なものは何もありません.

または、これを行うためのより良い方法があるかもしれません。

4

1 に答える 1

3

上記の私のコメントに続く回答を追加するだけです。

基本的に、インスタンス プールは、主キーで編成されたオブジェクトのコレクションです。これはクエリのキャッシュではなく、特定のインスタンスの 1 つです。特定のレコードをリクエストすると、そのレコードはそのクラスのインスタンス プールに追加されます。次にそのレコードを主キーでもう一度リクエストすると、Propel はデータベースにヒットする代わりに、キャッシュされたオブジェクトを返します。->find()Propelを発行するたびに、インスタンス プールに関係なく、データベースがヒットします。

生成された基本クラスでは、メソッドを探して、findPkそれが と をどのように使用しているかを確認することgetInstanceFromPool()で、この動作を確認できますaddInstanceToPool()

例えば:

$entity1 = EntityQuery::create()->findPk(13); // WILL hit database
$entity2 = EntityQuery::create()->findPk(13); // WILL NOT hit database

// This WILL hit DB, even if there is only 1 record & it is in the instance pool
$entity3 = EntityQuery::create()->findOneByName("Record Thirteen");
// This will also hit the DB EVERY TIME, regardless of the instance pool
// even though it is the same query
$entity4 = EntityQuery::create()->findOneByName("Record Thirteen");

// This will always hit the database, even if the instance is in the pool
$entity5 = EntityQuery::create()->findByUniqueField("Unique Value");

お役に立てれば。繰り返しますが、これは憶測ではありません。コードを調べて、これを再確認しました。生成された基本クラスとpropel/runtime/lib/query/ModelCriteria.php(具体的にはfind()メソッド) を調べて、それがどのように機能するかを確認できます。

于 2013-04-05T20:22:39.000 に答える