【问题标题】:pg_connect with PGSQL_CONNECT_FORCE_NEW flag带有 PGSQL_CONNECT_FORCE_NEW 标志的 pg_connect
【发布时间】:2012-08-29 07:40:31
【问题描述】:

我继承了一个用 PHP 编写的 Web 应用程序,它使用 PostgresSQL 作为数据库服务器。 我对 PHP 和 PostgresSQL 没有任何经验,我来自 Java / C# 背景。 我正在研究它是如何工作的,当我分析它时,我注意到老程序员在每次页面请求期间都会实例化一个名为 Database 的类,他在其中使用以下方式打开与数据库的连接:

$this->connection = pg_connect($qs, PGSQL_CONNECT_FORCE_NEW)

分析器告诉我这是一个非常昂贵的调用(页面在 2.7 秒内加载...),我想知道是否以及何时真正需要标志 PGSQL_CONNECT_FORCE_NEW。由于连接字符串始终相同,因此我尝试使用 pg_pconnect 代替(甚至没有该标志的 pg_connect),并且页面加载时间仅为 741 毫秒。 现在一切似乎都很好,但我有点担心这可能会在某个地方破坏应用程序,而且由于我没有 PHP 经验,我想知道使用该标志的做法是否有某种意义我需要检查的场景。显然,没有可依赖的单元测试。 作为旁注,你知道关于这个 pg_(p)connect 如何真正工作的好资源吗?官方文档好像不够深入。

谢谢!

【问题讨论】:

  • 性能提升似乎意味着每页调用 pg_connect 多次,否则应该没有任何区别。探查器结果是否表明每页有多个调用?
  • 刚刚检查,你的假设是正确的,pg_connect 被调用了 12 次​​span>
  • 这似乎很疯狂,连接不应该打开一次然后传递给需要它的人吗?
  • 是的,那样会好很多。看起来最初的程序员不理解打开多个数据库连接的性能影响,并认为“强制新”听起来很安全。至少这比故意打开所有这些连接更合理。

标签: php postgresql


【解决方案1】:

警告:pg_pconnect 将在每个 Apache 后端的生命周期内维护一个连接,因此如果您最终拥有大量连接,请不要感到惊讶。如果它们最终同时发出查询,则会阻塞数据库服务器。

我从来没有听说过连接数据库需要 2 秒。我可以在 0.2 秒内启动 psql、连接、发出查询并获得响应,这在我的旧上网本上。检查您的网络设置或类似的设置 - 这里发生了一些奇怪的事情。

【讨论】:

  • 谢谢你的建议,我去看看。关于 pg_pconnect:我也只尝试了 pg_connect,但没有 PGSQL_CONNECT_FORCE_NEW 具有相同的性能提升。我仍然不清楚这里发生的整个生命周期,你对这个话题有什么好的参考吗?谢谢
  • 如果它也对 pg_connect 进行了更改,则表明它在脚本中连接了多次。这似乎是不必要的(除非您知道其他情况),但可以解释延迟。也许添加一个计数器或记录调用以查看有多少。
  • 是的,正如我在上面的评论中所写的,分析器显示该函数被调用了 12 次。这似乎完全没有必要,因为一个好的设计应该能够打开连接一次然后传递它,或者至少我是这样认为的..
【解决方案2】:

使用时,此常量告诉 pg_connect 每次都创建一个新连接,而不是使用已经打开的连接。这可能表明程序使用了一些依赖于会话的功能,例如:

祝你好运

【讨论】:

  • 好像根本不使用临时表,能否请您详细说明其他两点?那将非常有帮助!再次感谢您
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2015-08-28
  • 2014-11-08
  • 2012-04-03
相关资源
最近更新 更多