2012-12-20 12 views
5

Ich habe Probleme zu entscheiden, was wäre die optimale Lösung für meine Web-App, die Zugriff auf (hauptsächlich Lesen) viele Male die gleichen Benutzerdaten in jeder Sitzung.mysql pdo transaction und session storage

Sollte ich beim Öffnen einer neuen Sitzung alle Benutzerdaten (etwa 40 Felder) gleichzeitig auf $ _SESSION abrufen oder sollte ich eine persistente PDO (mysql) Verbindung beibehalten und bei jeder Skriptausführung nur die benötigten Parameter aus der Datenbank abfragen stattdessen?

AUCH:

Gäbe es einen großen Unterschied in der Leistung zwischen dem Lesen sein/viele Felder auf einmal zu aktualisieren (whith eine benutzerdefinierte Abfrage) oder nacheinander (mit einer benutzerdefinierten Kombination allgemeiner Abfragen) in die gleiche Transaktion? z.B.

$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; 

gegen

$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; 
+2

Sie können eine Datenbankverbindungsressource nicht in eine Sitzung serialisieren. Ich würde sagen, dass diese Debatte beigelegt ist. – deceze

Antwort

1

Kann nicht gemacht werden. Selbst wenn Sie dies tun könnten, ist es eine schlechte Idee. Sie würden eine Situation mit vielen gleichzeitigen offenen Verbindungen erstellen, die Ihre maximalen Verbindungen überschreiten würden.

Ich bin nicht sicher, warum Sie ständig die Sitzung mit den gleichen Daten zu aktualisieren. Einfach die Daten in die Sitzung einfügen und fertig sein.

Wenn Sie mit einem großen Datensatz arbeiten, sollten Sie das Caching in Betracht ziehen. Dies würde die Datenbanklast reduzieren. Sie könnten Memcached verwenden. Dadurch wird die Leistung verbessert. Sie können angeben, welche und wie viele Ressourcen zwischengespeichert werden sollen.

0

Sie sollten die Daten in der Sitzung halten.

Sie können keinen Handler sicher in der Sitzung halten - in Ihrem Fall db-Verbindung - da die Kennung bei der nächsten Anfrage möglicherweise nicht identisch ist. Auch offene Verbindungen für den Fall zu behalten, ist vielleicht nicht das Beste, was zu tun ist.

Wenn Sie die Daten auf irgendeine Weise laden, halten Sie einfach in Sitzung - wenn Sie es jedes Mal abfragen, werden Sie mindestens die gleiche Menge an Speicher verwenden, wird aber eine DB-Abfrage durchführen, so wird die Leistung schlechter als nur die Daten behalten. Wenn Sie die Daten bei jeder Anfrage aktualisieren müssen, tun Sie dies nur mit einer neuen Verbindung. Versuchen Sie nicht, den Verbindungshandler in der Sitzung zu behalten.

2

Gäbe es einen großen Unterschied in der Leistung seine

I gibt es einen Unterschied in der gesunden Menschenverstand sagen würde.
Warum eins nach dem anderen wiederholen, während Sie es gleichzeitig tun können? Gibt es einen Grund, mehr Code für die gleiche Aufgabe zu schreiben?
Es scheint, dass Sie nach Problemen suchen, nicht wo sie wirklich sind.

+0

Da, abhängig vom Szenario (Benutzereingabe), ich möglicherweise verschiedene Kombinationen von Parametern ändern müssen. Ich bin mit ACID-Transaktionen noch nicht so vertraut und würde gerne wissen, wie groß der Engpass im Vergleich zur Zeit ist, Abfragen zu optimieren, wenn mehr als eine Spalte einer bestimmten Tabelle in derselben Transaktion geändert wird würde die Anweisungen in einer Abfrage verbinden, anstatt eine Transaktion zu starten, alle auszuführen und dann zu committen ... – NotGaeL

+0

Wie auch immer, ich stelle mir vor, was Sie mir sagen wollen ist, dass es keine gute Idee ist, get/set-Funktionen zum Abrufen/Aktualisieren jedes Parameters zu haben (etwas, an das ich nie gedacht hätte, bevor ich über PDO- und ACID-Transaktionen lese), und das ist alles, was ich wissen wollte, aber wie Sie sehen können, bin ich ein wenig in den Konzepten hier verloren, also würde ich mich freuen, wenn Sie mir etwas Literatur zu dem Thema zeigen könnten, das Sie kennen (außer PHP) Handbuch und Wikipedia, meine aktuellen Referenzen). Vielen Dank. – NotGaeL