2013-12-21 48 views

回答

20

單個連接被阻塞。執行一個查詢時,它不能執行其他查詢。因此,您的數據庫吞吐量可能會降低。

一個池管理許多懶洋洋地創建的(在felixge的模塊中)連接。當一個連接忙於運行查詢時,其他連接可用於執行後續查詢。這可以導致應用程序性能的提高,因爲它允許多個查詢並行運行。

4

連接池允許您重複使用現有的數據庫連接,而不是爲每個對Node應用程序的請求打開一個新的連接。

許多PHP和.NET人們習慣於連接池,因爲在這些平臺上的標準數據訪問層自動連接池(取決於你如何訪問數據庫。)

打開一個新的數據庫連接需要時間和服務器資源。使用已經存在的連接要快得多,總體而言,如果使用連接池,則應用程序在任何時候都需要保持較少的總打開連接數。

node-mysql的連接池功能工作得很好,易於使用。我將池保存在一個全局變量中,並將其傳遞給任何需要訪問數據庫的模塊。

例如,在這裏的應用服務器的env_settings變量持有全局設置,包括活動連接池:

var http = require("http"); 
var mysql = require('mysql'); 

var env_settings = { 
    dbConnSettings: { 
     host: "localhost", 
     database: "yourDBname", 
     user: "yourDBuser", 
     password: "yourDBuserPassword" 
    }, 
    port: 80 
}; 

// Create connection pool 
env_settings.connection_pool = mysql.createPool(env_settings.dbConnSettings); 

var app = connect() 
    .use(site.ajaxHandlers(env_settings)); 

http.createServer(app).listen(env_settings.port); 

,這裏是一個使用連接池的ajaxHandlers模塊:

ajaxHandlers = function (env_settings) { 

    return function ajaxHandlers(req, res, next) { 

     var sql, connection; 

     env_settings.connection_pool.getConnection(function(err, connection) { 

      sql = "SELECT some_data FROM some_table"; 

      connection.query(sql, function(err, rows, fields) { 

       if (err) { 
        connection.release(); 
        // Handle data access error here 
        return; 
       } 

       if (rows) { 
        for (var i = 0; i < rows.length; i++) { 
         // Process rows[i].some_data 
        } 
       } 

       connection.release(); 
       res.end('Process Complete'); 
       return; 
      }); 
     }); 
    } 
} 

/* Expose public functions ------ */ 
exports.ajaxHandlers = ajaxHandlers; 

connection_pool.getConnection方法是異步的,因此當現有的打開連接從池中返回時,或者需要時打開一個新連接時,則會調用回調函數,您可以使用connec灰。還請注意使用connection.release(),而不是像往常一樣結束連接。該版本只允許池回收連接,以便可以重新使用。

這是考慮差異的好方法。以一個非常簡單的應用程序爲例,該應用程序接受請求並返回包含結果的數據集。如果沒有連接池,每次發出請求時都會向數據庫打開一個新連接,返回結果,然後關閉連接。如果應用程序每秒獲得更多的請求可以完成,那麼併發打開事務的數量會增加,因爲在任何時候都有多個活動連接。另外,每次交易都會花費更長的時間,因爲它必須打開一個到數據服務器的新連接,這是一個相對較大的步驟。

使用連接池時,應用程序只會在池中沒有連接時打開新連接。因此,游泳池將在前幾個請求時打開一系列新的連接,並將其打開。現在,當發出新的請求時,連接池過程將獲取一個已經打開並且之前使用的連接,而不是打開新的連接。這會更快,並且在負載較重的情況下,數據庫的活動連接會減少。當然,當沒有人訪問服務器時,會有更多的「等待」連接打開,因爲它們被保存在池中。但這通常不是問題,因爲無論如何,服務器在這種情況下都有足夠的可用資源。

因此,可以使用數據庫連接池來使您的應用程序更快,更具可擴展性。如果你的流量很少,那麼它就不那麼重要了 - 除非你想盡可能快地返回結果。連接池如果經常是整體策略的一部分,以減少延遲並提高整體性能。

+1

可以請你描述php mysql創建連接的方式與節點js連接池不同。 PHP自動處理池請求的數量?哪個更好的nodejs mysql連接池或php的mysql連接? – Rijo