5

我很难确定我的网络应用程序的最佳解决方案是什么,该应用程序在每个会话中多次访问(主要是读取)相同的用户数据。

我应该在打开新会话时一次将所有用户数据(大约 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;
4

3 回答 3

2

性能会不会有很大差异

我会说常识上有区别。
为什么要一个一个地重复,而你可以一次做呢?是否有任何理由为同一任务编写更多代码?
看来你是在寻找麻烦,而不是他们真正所在的地方。

于 2012-12-21T09:44:26.057 回答
1

无法完成。即使你能做到这一点,这也是一个坏主意。您将创建一个具有大量并发打开连接的情况,这些连接将超过您的最大连接数。

我不确定为什么您必须使用相同的数据不断更新会话。只需将数据一次放入会话中,即可完成。

如果您正在处理大型数据集,您可能需要考虑缓存。这将减少数据库负载。您可以使用 memcached。这将提高性能,它允许您指定要缓存的资源和数量。

于 2012-12-20T15:02:50.823 回答
0

您应该将数据保留在会话中。

您不能安全地保持会话中的任何处理程序 - 在您的情况下是数据库连接 - 因为下一个请求的标识符可能不同。此外,保持开放的连接以防万一可能不是最好的做法。

如果您以任何方式加载数据,只需保持会话 - 如果您每次查询它,您将使用至少相同数量的内存,但会执行数据库查询,因此与仅保留数据相比性能会更差。如果您需要在每个请求中刷新数据,只需使用新连接即可,不要尝试将连接处理程序保留在会话中。

于 2012-12-20T14:56:42.030 回答