ejemplo - php pdo rollback
mysql pdo transacción y almacenamiento de sesión (3)
Tengo problemas para decidir cuál sería la solución óptima para mi aplicación web, que es acceder (principalmente leer) muchas veces los mismos datos de usuario en cada sesión.
¿Debo recuperar todos los datos de usuario a la vez (unos 40 campos) a $ _SESSION al abrir una nueva sesión o debo mantener una conexión PDO (mysql) persistente y consultar solo los parámetros que necesito de la base de datos en cada ejecución de script en su lugar?
ADEMÁS:
¿Habría una gran diferencia en el rendimiento entre leer / actualizar una gran cantidad de campos a la vez (con una consulta personalizada) o uno por uno (con una combinación personalizada de consultas genéricas) en la misma transacción? p.ej
$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;
Debes mantener los datos en sesión.
No puede mantener en sesión de forma segura a ningún controlador, en su caso, conexión de base de datos, ya que es posible que el identificador de la próxima solicitud no sea el mismo. Además, mantener las conexiones abiertas por si acaso puede no ser lo mejor que se puede hacer.
Si carga los datos de cualquier forma, simplemente manténgase en sesión; si lo consulta cada vez, usará al menos la misma cantidad de memoria, pero realizará una consulta de DB, por lo que el rendimiento será peor en comparación con solo mantener los datos. Si necesita actualizar los datos en cada solicitud, simplemente hágalo con una nueva conexión, no intente mantener el controlador de conexión en la sesión.
No se puede hacer. Incluso si pudieras hacer esto, es una mala idea. Crearía una situación con muchas conexiones abiertas simultáneas que excederían sus conexiones máximas.
No estoy seguro de por qué tiene que actualizar continuamente la sesión con los mismos datos. Simplemente ponga los datos en la sesión una vez y termine.
Si está tratando con un conjunto de datos grande, es posible que desee considerar el almacenamiento en caché. Esto reduciría la carga de la base de datos. Puedes usar memcached. Esto mejorará el rendimiento, le permite especificar qué y cuántos recursos almacenar en caché.
¿Habría una gran diferencia en el rendimiento?
Yo diría que hay una diferencia en el sentido común.
¿Por qué repetir uno por uno mientras puedes hacerlo de una vez? ¿Hay alguna razón para escribir más código para la misma tarea?
Parece que estás buscando problemas, no donde realmente están.