2012-12-20 26 views
5

Mam problem z wyborem optymalnego rozwiązania dla mojej aplikacji internetowej, która uzyskuje dostęp (głównie czytając) wielokrotnie te same dane użytkownika w każdej sesji.mysql pdo transakcja i przechowywanie sesji

Czy powinienem pobrać wszystkie dane użytkownika naraz (około 40 pól) do $ _SESSION podczas otwierania nowej sesji lub czy powinienem utrzymywać stałe połączenie PDO (mysql) i wyszukiwać tylko te parametry, których potrzebuję z bazy danych przy każdym wykonaniu skryptu zamiast?

TAKŻE:

Czy istnieje duża różnica w wydajności pomiędzy odczyt/aktualizowania wielu dziedzinach na raz (pokojowe kwerendy niestandardowej) lub jeden po drugim (z kombinacji niestandardowych zapytań ogólnych) w ta sama transakcja? na przykład

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

vs.

$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

Nie można serializować zasobu połączenia z bazą danych w sesję. Powiedziałbym, że to rozstrzygnie tę debatę. – deceze

Odpowiedz

1

Nie można tego zrobić. Nawet jeśli mógłbyś to zrobić, jest to zły pomysł. Tworzysz sytuację z dużą ilością współbieżnych otwartych połączeń, które przekraczają twoje maksymalne połączenia.

Nie jestem pewien, dlaczego musisz aktualizować sesję z tymi samymi danymi. Wystarczy umieścić dane w sesji jeden raz i gotowe.

Jeśli masz do czynienia z dużym zbiorem danych, możesz rozważyć buforowanie. Spowoduje to zmniejszenie obciążenia bazy danych. Możesz użyć memcached. Poprawi to wydajność, pozwala określić, ile i ile zasobów buforować.

0

Należy zachować dane w sesji.

Nie można bezpiecznie przechowywać w sesji żadnego programu obsługi - w przypadku Twojego połączenia db - ponieważ identyfikator na następnym żądanie może nie być taki sam. Również utrzymywanie otwartych połączeń na wszelki wypadek może nie być najlepszą rzeczą do zrobienia.

Jeśli załadujesz dane w jakikolwiek sposób, po prostu zachowaj w sesji - jeśli za każdym razem będziesz je wyszukiwał, użyjesz przynajmniej tej samej ilości pamięci, ale wykonasz zapytanie DB, więc wydajność będzie gorsza niż w przypadku zwykłego przechowywanie danych. Jeśli chcesz odświeżyć dane dla każdego żądania, po prostu zrób to z nowym połączeniem, nie próbuj utrzymywać procedury obsługi połączenia w sesji.

2

Czy istnieje duża różnica w wydajności

Powiedziałbym, że istnieje różnica w zdrowym rozsądkiem.
Dlaczego powtarzać jeden po drugim, podczas gdy można to zrobić naraz? Czy jest jakikolwiek powód, aby napisać więcej kodu dla tego samego zadania?
Wygląda na to, że szukasz kłopotów nie tam, gdzie naprawdę są.

+0

Ponieważ, w zależności od scenariusza (dane wejściowe użytkownika), może zajść konieczność zmodyfikowania różnych kombinacji parametrów. Nie jestem jeszcze zaznajomiony z transakcjami ACID i chciałbym się dowiedzieć, jak dużo wąskiego gardła w porównaniu z czasem poświęconym na optymalizację zapytań, więc gdy więcej niż jedna kolumna konkretnej tabeli jest modyfikowana na tej samej transakcji, "d połączyć wyciągi w jednym zapytaniu, zamiast rozpoczynać transakcję, wykonując je wszystkie, a następnie zatwierdzając ... – NotGaeL

+0

W każdym razie, wyobrażam sobie, co próbujesz mi powiedzieć, że nie jest dobrym pomysłem mieć funkcje pobierania/ustawiania dla pobierania/aktualizowania każdego parametru (coś, czego nigdy bym nie pomyślał przed rozpoczęciem czytania o PDO i transakcjach ACID), i to wszystko, co chciałem wiedzieć, ale jak widzisz, jestem trochę zagubiony w koncepcjach tutaj, więc byłbym wdzięczny, gdybyś mógł wskazać mi literaturę na temat, który znasz (poza PHP podręcznik i wikipedia, moje aktualne referencje). Dziękuję Ci bardzo. – NotGaeL