CodeIgniter的Connecting to Multiple Databases,是否會造成大量連線數?

最近有人問了一個關於CodeIgniter的資料庫連線問題。問題是,當一個controller執行時,可能呼叫多的model。如果這些model在開資料庫連線時,全都採用"Connecting to Multiple Databases"的方式,豈不是一個網頁就會產生多個資料庫連線?

CI採用singleton pattern。但"Connecting to Multiple Databases"的模式,卻是return instance。所以,這個疑問是有可能發生的。於是測試了一下…

做了一個小實驗。寫一個controller,他會呼叫三個不同的model。這三個model都採用"Connecting to Multiple Databases"方式,都連到同一台資料庫。如此,該資料庫上是不是就會有三個連線?

用var_dump()看每個連線,果然每個連線的resoure id都不同(共三個)。但直接在資料庫上看連線數,卻只有一個。這樣的結果蠻奇怪的。想了一下,原來是和php開啟資料庫處理方式有關。

我這次測試,使用兩種資料庫-Sybase、MSSql。兩者的狀況分別如下…

Sybase是使用sybase_connect()開啟資料庫連線。在開啟連線時,我們會傳入程式名稱,作為識別。就算不傳入此參數,php 也會自動以php及版本代號傳入。

在"同一支程式"內,傳入相同的appname,sybase_connect()就不會另外開啟新的資料庫連線。也就是說,只會產生一個資料庫連線。原文說明如下…
Specifies an appname for the Sybase connection. This allow you to make separate connections in the same script to the same database. This may come handy when you have started a transaction in your current connection, and you need to be able to do a separate query which cannot be performed inside this transaction.

MSSql是使用mssql_connect()開啟資料庫連線。如果沒有特別設定參數new_link為TRUE,在"同一支程式"內,其實也不會建立新的連線。原文說明如下…
If a second call is made to mssql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned. This parameter modifies this behavior and makes mssql_connect() always open a new link, even if mssql_connect() was called before with the same parameters.

因此,當我刻意讓每次連Sybase時都傳入不同的appname時、或者連MSSql設定new_link為TRUE。果然就如原本所猜測…兩種資料庫都會產生三個資料庫連線了。

參考資料

  1. Connecting to your Database : CodeIgniter User Guide
  2. PHP sybase_connect()
  3. PHP mssql_connect()

留言