5

すべてのセッションで同じユーザーデータに何度もアクセス(主に読み取り)しているWebアプリに最適なソリューションを決定するのに苦労しています。

新しいセッションを開くときに、すべてのユーザーデータ(約40フィールド)を一度に$ _SESSIONに取得する必要がありますか、それとも永続的なPDO(mysql)接続を維持し、代わりにスクリプトの実行ごとにデータベースから必要なパラメーターのみをクエリする必要がありますか?

また:

同じトランザクションで一度に多数のフィールドを読み取る/更新する(カスタムクエリを使用する)場合と、1つずつ(汎用クエリのカスタムの組み合わせを使用する場合))のパフォーマンスに大きな違いはありますか?例えば

$dbh = new PDO("mysql:host=localhost;dbname",$dbuser,$dbpass,array(PDO::ATTR_PERSISTENT => true));

$fieldlist='';
foreach ($fields as $i=>$field){
    $fieldlist.=$field['name'].':field'.$i.',';
}
rtrim($fieldlist,',');
$dbh->prepare("UPDATE user SET ".$fieldlist." WHERE name=:name");
foreach ($fields as $i=>$field){
    $stmt->bindValue(':field'.$i, $field['value'], PDO::PARAM_STR);
}
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();

$dbh = null;

対。

$dbh = new PDO("mysql:host=localhost;dbname",$dbuser,$dbpass,array(PDO::ATTR_PERSISTENT => true));


$dbh->beginTransaction();

foreach($fields as $field){
    $stmt=$dbh->prepare("UPDATE user SET ".$field['name']."=:field WHERE name=:name");
    $stmt->bindValue(':field', $field['value'], PDO::PARAM_STR);
    $stmt->bindValue(':name', $name, PDO::PARAM_STR);
    $stmt->execute();
}

$dbh->commit();

$dbh = null;
4

3 に答える 3

2

性能に大きな違いはないか

常識に違いがあると言えます。
一度にできるのに、なぜ一つずつ繰り返すのですか?同じタスクのためにさらにコードを書く理由はありますか?
問題が実際にある場所ではなく、問題を探しているようです。

于 2012-12-21T09:44:26.057 に答える
1

できません。これができたとしても、それは悪い考えです。最大接続を超える多数の同時オープン接続がある状況を作成します。

同じデータでセッションを継続的に更新する必要がある理由がわかりません。一度セッションにデータを入れるだけで完了です。

大規模なデータ セットを扱っている場合は、キャッシュを検討することをお勧めします。これにより、データベースの負荷が軽減されます。memcached を使用できます。これによりパフォーマンスが向上し、キャッシュするリソースとその数を指定できます。

于 2012-12-20T15:02:50.823 に答える
0

データをセッションに保持する必要があります。

次のリクエストの識別子が同じではない可能性があるため、ハンドラー(あなたの場合はdb接続)を安全にセッションに保持することはできません。また、万が一に備えて接続を開いたままにしておくことは、最善の方法ではない場合があります。

データを何らかの方法でロードする場合は、セッションを維持するだけです。毎回クエリを実行すると、少なくとも同じ量のメモリを使用しますが、DB クエリを実行するため、データを保持するだけに比べてパフォーマンスが低下します。リクエストごとにデータを更新する必要がある場合は、新しい接続でそれを行い、セッションで接続ハンドラーを保持しようとしないでください。

于 2012-12-20T14:56:42.030 に答える