mysql pdo транзакция и хранение сессии
У меня возникают проблемы с выбором оптимального решения для моего веб-приложения, которое каждый раз получает доступ (в основном к чтению) к одним и тем же данным пользователя.
Должен ли я извлекать все пользовательские данные сразу (около 40 полей) в $_SESSION при открытии нового сеанса или я должен сохранять постоянное соединение PDO (mysql) и запрашивать только те параметры, которые мне нужны, из базы данных при каждом выполнении сценария?
ТАКЖЕ:
Будет ли большая разница в производительности между чтением / обновлением большого количества полей одновременно (с помощью пользовательского запроса) или по одному (с пользовательской комбинацией общих запросов) в одной и той же транзакции? например
$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;
3 ответа
Не может быть сделано Даже если бы ты мог сделать это, это плохая идея. Вы бы создали ситуацию с множеством одновременных открытых соединений, которые превысили бы ваши максимальные соединения.
Я не уверен, почему вы должны постоянно обновлять сессию с теми же данными. Просто поместите данные в сеанс один раз, и все будет готово.
Если вы имеете дело с большим набором данных, вы можете рассмотреть возможность кэширования. Это уменьшит нагрузку на базу данных. Вы могли бы использовать memcached. Это повысит производительность, позволит указать, что и сколько ресурсов для кэширования.
Будет ли большая разница в производительности
Я бы сказал, что есть разница в здравом смысле.
Зачем повторять один за другим, когда вы можете сделать это сразу? Есть ли причина писать больше кода для той же задачи?
Кажется, вы ищете проблемы не там, где они есть.
Вы должны держать данные в сессии.
Вы не можете безопасно поддерживать в сеансе любой обработчик - в вашем случае соединение с БД - так как идентификатор в следующем запросе может не совпадать. Кроме того, сохранение открытых соединений на всякий случай может быть не лучшим решением.
Если вы загружаете данные любым способом, просто продолжайте сеанс - если вы будете каждый раз запрашивать его, вы будете использовать как минимум один и тот же объем памяти, но будете выполнять запрос к БД, поэтому производительность будет хуже по сравнению с простым хранением данных. Если вам нужно обновлять данные каждый запрос, просто сделайте это с новым соединением, не пытайтесь сохранить обработчик соединения в сеансе.