【问题标题】:Oracle persistent connections maxing out server from asyncronous PHP scriptsOracle 持久连接从异步 PHP 脚本中最大化服务器
【发布时间】:2012-08-16 10:42:26
【问题描述】:

我在 PHP 中编写了一个简单的 OCI 包装类,它使用持久连接 (oci_pconnect)。类析构函数调用oci_close

这个类用于我所有的 AJAX PHP 脚本,因此被大量调用。然而,尽管使用了持久连接并且oci_close 没有从缓存中删除它们(根据我的理解),但与数据库的打开连接数已达到最大值,导致系统失败。我原以为整个应用程序的打开连接数只有一个!

我做错了什么吗?


骨架代码:

class Oracle {
  private $connection;
  private $connected;

  function __construct($connectionString, $username, $password) {
    if (!($this->connection = @oci_pconnect($username, $password, $connectionString))) {
      echo 'Cannot connect to '.$username.'@'.$connectionString;
      $this->connected = false;
    } else {
      $this->connected = true;
    }
  }

  function __destruct() {
    if ($this->connected) {
      oci_close($this->connection);
    }
  }
}

【问题讨论】:

  • 我在继承系统时遇到了同样的问题。放弃 oci_pconnect 以支持 oci_connect(非持久性)
  • 它解决了问题,所以从来没有发现为什么连接没有被重用。
  • 虽然这可以解决问题,但它会使系统明显变慢。
  • 所有连接都使用相同的用户名、密码和连接字符串吗?
  • @BobJarvis 是的,它们都连接到同一个 SID 上的同一个模式

标签: php oracle persistence oracle-call-interface


【解决方案1】:

如果您希望它是持久的,请不要关闭连接。

【讨论】:

  • 来自documentation:“oci_close() 函数不会关闭使用oci_pconnect() 创建的底层数据库连接。”... oci_close 因此不能按文档说明工作吗?
  • 这可能已经过时了。 oci_close() 自 PHP 5.3 起关闭持久连接。
  • @Xophmeister 根据您的设置和 PHP 版本,oci_close 可能能够关闭 oci_pconnect(): PHP Doc
  • 我使用的是 PHP 5.2.17,但oci8.persistent_timeout = -1,所以大概是oci_close 正在关闭连接...有人可以确认吗?
  • 无法确认,但有两件事:1)您系统的行为似乎表明情况并非如此 - 或者至少表明基础数据库连接没有被关闭,以及 2)测试起来很简单——注释掉 oci_close 调用,看看会发生什么。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多