2012-12-20 86 views
5

我無法決定什麼是我的web應用程序的最佳解決方案,它正在訪問(主要是讀取)許多次每個會話上的相同用戶數據。mysql pdo交易和會話存儲

我應該一次檢索所有用戶數據(大約40個字段)到$ _SESSION打開一個新的會話,或者我應該保持一個持久的PDO(mysql)連接並查詢每個腳本執行所需的數據庫參數代替?

ALSO:

會不會有介於兩者之間的性能有很大的區別讀/更新在很多領域的一次(蒙山自定義查詢)或一個接一個(與通用查詢的自定義組合)同一筆交易?例如

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

您不能序列化數據庫連接資源到會話中。我會說這個辯論已經結束。 – deceze

回答

1

無法完成。即使你可以做到這一點,這是一個壞主意。你會創建一個有很多併發打開連接的情況,這會超出你的最大連接。

我不知道爲什麼你必須不斷更新會話與相同的數據。只需將數據放入會話中一次,然後完成。

如果您正在處理大型數據集,則可能需要考慮緩存。這將減少數據庫負載。你可以使用memcached。這將提高性能,它允許您指定要緩存的資源和數量。

0

你應該保持在會話中的數據。

您不能安全地保持會話中的任何處理程序 - 在您的情況db連接 - 作爲下一個請求的標識符可能不一樣。此外,保持開放連接以防萬一也許不是最好的事情。

如果您以任何方式加載數據,只是保持會話 - 如果您每次查詢它,您將至少使用相同數量的內存,但會執行數據庫查詢,因此性能會比僅僅更差保持數據。如果您需要每次請求都刷新數據,只需使用新連接執行此操作,不要嘗試在會話中保留連接處理程序。

2

會不會有性能有很大的區別

我會說有常識的差異。
爲什麼一個一個重複,而你可以一次做?是否有理由爲相同任務編寫更多代碼?
看來你正在尋找麻煩而不是他們真正的地方。

+0

因爲,根據情景(用戶輸入),我可能需要修改不同的參數組合。我對ACID事務還不是很熟悉,我想知道與花時間優化查詢相比,這個瓶頸有多大,因此當同一事務I上修改了多個特定表的列時'd在一個查詢中加入這些語句,而不是啓動一個事務,執行所有這些事務,然後提交... – NotGaeL

+0

無論如何,我想你要告訴我的是,獲取/設置函數來檢索/更新每個參數並不是一個好主意(在開始閱讀PDO和ACID事務之前,我從未想過的事情),這就是我想知道的,但正如你所看到的,我對這裏的概念有點遺憾,所以我希望你能告訴我一些關於你知道的主題的文獻(除PHP以外手冊和維基百科,我目前的參考)。非常感謝你。 – NotGaeL