【问题标题】:Will calling mysql_connect() and mysql_close() 16 times causing high DB connections?调用 mysql_connect() 和 mysql_close() 16 次会导致高数据库连接吗?
【发布时间】:2014-03-19 10:45:35
【问题描述】:

我有一个基于 Joomla1.5 的系统。我运行分析器,发现 mysql_connect() 和 mysql_close() 这两个函数都被使用了 16 次。 我知道这两个功能和 Joomla 1.5 都已被社区弃用和强烈禁止。 我的系统面临性能问题,有时在高峰时段数据库连接线程变得太高(> 100)并且系统运行速度较慢。虽然我们有一个专用的 Windows 服务器。

Below is my DB server configuration:
Windows edition: Windows Server 2008 R2 Standard Service Pack 1
Processor: Intel(R) Xeon(R) CPU X5460 @3.16GHZ 3.16 GHZ (2 Processors)
Installed Memory(RAM): 8.00 GB
System type: 64-Bit Operating system

mysql_connect() 函数已在 JDatabaseMySQL 类的构造函数中使用。这意味着每当我们创建数据库对象时,这个 mysql_connect() 就会被执行并创建一个新的连接。

  • 我很想知道是否多次调用 mysql_connect() 函数创建如此高的 DB 连接线程问题?
  • 是否可以使用单个连接而不是启动对象,所以 很多次?如果是,我该怎么做?
  • 用 mysqli_connect() 替换 mysql_connection() 会帮助我们提高系统性能吗?
  • Joomla 如何管理连接池?

请在不建议升级 Joomla 的情况下提供您的答案。

【问题讨论】:

    标签: php performance joomla1.5 mysql-5.1


    【解决方案1】:

    Joomla!本身只连接到数据库一次。它使用单例模式来获取现有的数据库连接或在需要时创建它。

    听起来您有一些自定义代码或 Joomla!扩展正在多次实例化 JDatabase 类。您不应直接实例化或处理该类,而应使用JFactory 获取数据库对象,该对象在内部将获取现有对象或在需要时创建新对象:

    $db = JFactory::getDBO();
    

    【讨论】:

    • 你能描述一下Joomla是如何管理连接池的吗?它将如何检查现有的数据库连接?
    • 连接由JFactory管理。当某些代码需要数据库时,JFactory 检查它是否已经有一个连接对象,如果是,则返回它,如果没有,则创建一个新连接并返回它。显然,这仅在所有代码都使用JFactory::getDBO() 时才有效。如果某些自定义代码直接实例化 JDatabase,那么它将始终创建一个新连接。
    • 还有,Joomla!总是为每个请求创建一个新的数据库连接,它不会在多个请求之间共享一个连接。还要考虑 ajax 或其他请求是否有助于分析器正在观看的内容。
    • 感谢@MrCode,我无法理解您的评论 - Joomla! always creates a new database connection with each request, it doesn't share a connection across multiple requests. 在阅读您的第一条评论时会导致一些混乱。你能澄清一下吗?
    • 澄清一下,Joomla!为页面的每个 HTTP 请求创建一个新的数据库连接,然后将该连接共享给在请求期间执行的任何代码,因此 1 个连接对应 1 个 HTTP 请求。有些请求不会启动 Joomla!核心,因此不会创建连接,例如图像和 CSS/Javascript。
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多