Php 是否为每个查询创建新连接?
注意:我用谷歌翻译写了这个 为了使用MySQL,我一直在做以下工作:Php 是否为每个查询创建新连接?,php,mysql,Php,Mysql,注意:我用谷歌翻译写了这个 为了使用MySQL,我一直在做以下工作: -> Open Connection to the database. -> see details -> Insert Data -> another query -> close Connection 在关闭之前,我通常使用相同的连接做各种事情。 一位在墨西哥IPN研究此问题的朋友向我提到,正确的方法(为了安全)是为每个查询建立一个新的连接,例如: -> Open Connection
-> Open Connection to the database.
-> see details
-> Insert Data
-> another query
-> close Connection
在关闭之前,我通常使用相同的连接做各种事情。
一位在墨西哥IPN研究此问题的朋友向我提到,正确的方法(为了安全)是为每个查询建立一个新的连接,例如:
-> Open Connection to the database.
-> see details
-> close Connection
-> Open Connection to the database.
-> Insert Data
-> close Connection
-> Open Connection to the database.
-> another query
-> close Connection
insert into table1(relacion) values([insert into tablaRelacionada(id) values("dato")]);
我的问题是,什么是正确的做法?我的方法是对数据库进行最少的查询,只建立一个连接并保持它,直到它不再为我服务
此外,是否可以对表进行双重插入?例如:
-> Open Connection to the database.
-> see details
-> close Connection
-> Open Connection to the database.
-> Insert Data
-> close Connection
-> Open Connection to the database.
-> another query
-> close Connection
insert into table1(relacion) values([insert into tablaRelacionada(id) values("dato")]);
“relacion”是从“tablaRelacionada”中的第一个查询中插入的ID。不,不可能用一个
insert
语句将行插入两个不同的表中。(您可以使用触发器来完成,但该触发器需要发出一个单独的INSERT
语句…从客户端看,它看起来像一条语句,但在服务器上,将执行两条INSERT
语句
如果不考虑性能和可伸缩性,那么“搅动”连接是可行的。为每个语句创建单独的连接并不一定“错误”,但这是资源密集型的。创建新会话会产生大量开销。(从客户端看,这看起来相当简单,但除了客户端上的代码路径之外,还需要在服务器端进行大量工作。) 重用现有连接是一种常见的模式。实现“连接池”的最大好处之一是,可以轻松地重用连接,而无需“搅动”,重复连接和断开与数据库的连接 就每一条SQL语句的独立连接而言,在某种程度上增加了“安全性”,这有点牵强 但是我可以看到新初始化的会话的一些好处
例如,如果重用现有会话,您可能不知道会话状态中已做了哪些更改。以前所做的任何更改仍然“有效”。这可能是会话变量设置(例如时区、字符集、自动提交、用户定义变量)这可能会对当前语句产生影响。但是在一个脚本中,如果您获得了新的连接,您应该知道已经进行了哪些更改,所以这不应该是一个问题。(如果使用池中的连接,这将是一个更大的问题,因为池中的连接由多个进程共享。一个进程破坏时区或字符集,可能会导致重用该连接的其他进程出现大量问题。)在每个查询中使用单独的连接充其量只能让应用程序和数据库服务器陷入不必要的开销。我看到这里提到了三个方面:
多表插入 您所引用的内容是不可能的,您可能希望按照以下思路进行操作:
$dbh->query("INSERT tablaRelacionada(id) values('dato')");
$lastid = $dbh->lastInsertId();
$dbh->query("INSERT INTO table1(relacion) values($lastid);");
假设表tablaRelacionada
有一个自动递增列,这是您试图从第一个查询中获得的
请参阅:只要您需要1次或10次查询,就应该保持相同的连接处于打开状态。对于插入到表1中的
则为否…
@dub stylee:“当您通过Internet时,最好每次打开一个新连接。”---为什么?你意识到这会带来巨大的开销吗?如果我在另一个地方有一个MySQL,我首先要研究的是在两者之间建立一条安全的通信线路,例如通过使用OpenVPN和no,你朋友所说的神话在安全性方面对你没有任何帮助。安全性是通过正确地确保你拥有东西配置得很好,是最新的,只有必要的渠道向公众开放,这只是冰山一角。也许它在翻译中丢失了,但“你的朋友”是个白痴。@PeeHaa:太好了,我们这里有一个人可以这么直接;-)当然,我必须回到它,谢谢你的回复,我完全冷静了。另外,如果你的MySQL服务器不在同一个IDC或服务器中,并且需要使用这些服务器,那么使用VPN和限制IP以防止外部访问是一个好的选择。@Jorhel Reyes:我补充了一个关于多表插入器语法的问题的答案t在MySQL中,这是不可能的。