为每个查询创建新连接?

时间:2014-02-25 22:24:24

标签: php mysql

注意:我使用Google Translator来编写

我总是做以下工作来使用MySQL:

-> 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")]);

并且“relacion”是“tablaRelacionada”中第一个查询的插入ID。

2 个答案:

答案 0 :(得分:3)

不可以,使用单个INSERT语句将行插入两个不同的表中。 (您可以使用触发器来完成它,但是该触发器需要发出单独的INSERT语句......从客户端看起来它看起来像一个语句,但在服务器上,会有两个{ {1}}语句已执行。


如果不考虑性能和可扩展性,那么“搅拌”连接是可行的。为每个语句创建单独的连接没有必然“错误”,但它是资源密集型的。创建新会话有很多开销。 (从客户端看起来相当简单,但除了客户端上的代码路径之外,它还需要在服务器端进行大量工作。)

重用现有连接是一种常见模式。这是实现“连接池”的最大好处之一,可以轻松地重用连接,而无需“搅拌”,重复连接和断开数据库。

就每个SQL语句的单独连接而言,以某种方式增加“安全性”,这有点紧张。

但是我可以看到有一个刚刚初始化会话的好处。

例如,如果您重用现有会话,则可能不知道会话状态中所做的更改。之前所做的任何更改仍然“有效”。这可能是会话变量设置(例如时区,字符集,自动提交,用户定义变量),它们可能会对当前语句产生影响。但是在一个单独的脚本中,你已经获得了新的连接,你应该知道已经做了哪些更改,所以这不应该是一个问题。 (这对于使用来自池的连接更是一个问题,其中连接由多个进程共享。使用时区或字符集的一个进程可能会导致其他重用连接的进程出现大量问题。)

答案 1 :(得分:2)

每个查询使用一个单独的连接最好这是一个很好的方法,可以用不必要的开销使应用程序和数据库服务器陷入困境。我在这里提到了三个方面:

  1. 效率
  2. 应用程序安全性
  3. 网络安全
  4. 1。效率

    简答:糟糕的主意。

    初始化连接所需的开销通常远远超过运行实际查询所需的开销。如果采用每个查询连接方法,您的应用程序可能会运行更慢的数量级

    2。应用程序安全性

    简短的回答:一般来说是个坏主意,但在PHP的上下文中完全没必要。

    我能想到的唯一“安全”问题是担心用户访问剩余的临时表,或会话设置“流血”。除非您使用非默认的持久连接,否则不太可能发生这种情况。同样,MySQL中的大多数临时值都是按连接存储的,除非你有一些PHP代码写得很差[以特定的,奇怪的,很少推荐的方式,即。共享数据库单例并奇怪地访问它们然后可能如果行星对齐恰好你可能会以一种意想不到的方式访问某些特定于MySQL会话的数据。

    这与preemptive optimization几乎相同,不值得担心。

    3。网络安全

    简答:不。什么?只是...... 没有

    如果你担心某人偷看你的连接,解决方案就是不要制作更多的连接,而是要让他们安全地MySQL supports SSL,如果你担心,请使用它。

    TL; DR 否。不要为每个查询创建单独的连接。坏。谁告诉你这个需要回到学校。


    多表插页

    您所引用的内容是不可能的,您可能希望按照以下方式执行某些操作:

    $dbh->query("INSERT tablaRelacionada(id) values('dato')");
    $lastid = $dbh->lastInsertId();
    $dbh->query("INSERT INTO table1(relacion) values($lastid);");
    

    假设表tablaRelacionada有一个AUTO_INCREMENT列,这是您尝试从第一个查询中获取的。

    请参阅:lastInsertId()