0

我的 PHP 代码允许用户在只读用户中执行任意 SQL 代码。它还需要访问具有写入能力的用户。我的代码在“可写用户”中执行命令,然后使用单独的连接使用“只读用户”查询数据库。然后它再次使用“可写用户”进行查询并退出脚本。

当它执行只读用户的查询时,它使具有写入能力的用户的连接保持打开状态。据我所知,这是最好的方法,但我的大学担心这在某种程度上是 MySQL 不好的做法,并希望关闭具有写入能力的用户的连接并稍后重新打开它(大概是因为它使与MySQL。)最好的方法是什么?

什么更有效,为什么:每页一个数据库连接或每个函数一个数据库连接?说“通常数据库连接的创建成本很高。”

4

2 回答 2

2

什么更有效,为什么:每页一个数据库连接或每个函数一个数据库连接?说“通常数据库连接的创建成本很高。”

我会挑战这种说法。对于某些数据库可能是正确的,但不一定对所有数据库都是正确的。众所周知,MySQL 在创建连接时非常轻量级,在使用本地 unix 域套接字时更是如此。

更有趣的是:如果你使用一个要求连接不改变的功能怎么办?就像插入数据集然后选择 LAST_INSERT_ID()?如果您使用只读连接,这将不起作用。

虽然我确实认为使用只读用户帐户有利于安全性,但只有当这是脚本中使用的唯一帐户时才有意义。否则,您会以某种方式根据查询的类型来决定使用哪种连接 - 如果您会自动使用正确的连接来读取或写入,那么从安全角度来看,使用两个连接是没有意义的。

此外,如果 SELECT 将转到不同的连接,您将无法在事务期间使用 SELECT 语句。

总而言之:使用多个连接来做一个连接也可以做的事情似乎是个坏主意——除非你能给出更多你这样做的理由。

再次阅读您的问题,我偶然发现了您的特殊原因:您执行任意 SQL 语句。这样,使用受限帐户确实很有意义。打开和关闭等待写入的连接也没有任何意义。这样做的唯一原因是如果数据库服务器达到了他配置的并发连接限制。

于 2013-10-14T22:45:07.243 回答
1

只要您可以清楚地跟踪哪个连接是哪个连接,您当前的解决方案显然很好,甚至具有可以轻松扩展到主从场景的优势。有话要说,在需要时才打开写连接,但在网络请求的短暂世界中(我假设我们正在谈论),只要打开它就可以了如果您需要它,或者在请求可能结束时在 0.5 秒后自动关闭它。

如果我们要谈论永久运行的守护进程,无论如何,在 N 秒/分钟没有活动后关闭连接,无论如何您可能会有不止一个连接,使您能够异步运行多个查询。

于 2013-10-15T20:25:50.413 回答