2014-03-19 54 views
2

我有一個基於Joomla1.5的系統。我運行了剖析器,發現mysql_connect()和mysql_close()這兩個函數已經被使用了16次。 我知道這些功能和Joomla 1.5都已被棄用,並被社區強烈禁止。 我的系統正面臨性能問題,有時在高峯時段DB連接線程變得太高(> 100),系統運行速度變慢。雖然我們有專用的Windows服務器。將調用mysql_connect()和mysql_close()16次導致高數據庫連接?

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。

回答

3

Joomla!它本身只能連接到數據庫一次。它使用單例模式來獲取現有的數據庫連接,或者在需要時創建它。

這聽起來像你有一些自定義代碼或Joomla!擴展是多次實例化JDatabase類。你不應該實例化或處理類直接,而不是你應該使用JFactory獲取數據庫對象,它的內部要麼讓現有的或在需要時創建新:

$db = JFactory::getDBO(); 
+0

能否請您介紹的Joomla如何管理連接池?它將如何檢查現有的數據庫連接? – ursitesion

+1

連接由'JFactory'管理。當某些代碼需要數據庫時,JFactory會檢查它是否已經有連接對象,如果是,則返回它,否則,創建一個新連接並返回它。顯然這隻有在所有代碼都使用'JFactory :: getDBO()'時纔有效。如果一些自定義代碼直接實例化JDatabase,那麼它將始終創建一個新的連接。 – MrCode

+0

另外,Joomla!總是爲每個請求創建一個新的數據庫連接,但它不會跨多個請求共享連接。還要考慮一下ajax或其他請求是否會影響您的分析器正在觀看的內容。 – MrCode