我用https://github.com/felixge/node-mysql我的應用程序 當和爲什麼要使用當使用poolConnection或創建連接felixge /節點的MySQL
db_pool = mysql.createConnection(db);
或
db_pool = mysql.createPool(db);
有什麼區別?以及何時使用它們?
我用https://github.com/felixge/node-mysql我的應用程序 當和爲什麼要使用當使用poolConnection或創建連接felixge /節點的MySQL
db_pool = mysql.createConnection(db);
或
db_pool = mysql.createPool(db);
有什麼區別?以及何時使用它們?
單個連接被阻塞。執行一個查詢時,它不能執行其他查詢。因此,您的數據庫吞吐量可能會降低。
一個池管理許多懶洋洋地創建的(在felixge的模塊中)連接。當一個連接忙於運行查詢時,其他連接可用於執行後續查詢。這可以導致應用程序性能的提高,因爲它允許多個查詢並行運行。
連接池允許您重複使用現有的數據庫連接,而不是爲每個對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()
,而不是像往常一樣結束連接。該版本只允許池回收連接,以便可以重新使用。
這是考慮差異的好方法。以一個非常簡單的應用程序爲例,該應用程序接受請求並返回包含結果的數據集。如果沒有連接池,每次發出請求時都會向數據庫打開一個新連接,返回結果,然後關閉連接。如果應用程序每秒獲得更多的請求可以完成,那麼併發打開事務的數量會增加,因爲在任何時候都有多個活動連接。另外,每次交易都會花費更長的時間,因爲它必須打開一個到數據服務器的新連接,這是一個相對較大的步驟。
使用連接池時,應用程序只會在池中沒有連接時打開新連接。因此,游泳池將在前幾個請求時打開一系列新的連接,並將其打開。現在,當發出新的請求時,連接池過程將獲取一個已經打開並且之前使用的連接,而不是打開新的連接。這會更快,並且在負載較重的情況下,數據庫的活動連接會減少。當然,當沒有人訪問服務器時,會有更多的「等待」連接打開,因爲它們被保存在池中。但這通常不是問題,因爲無論如何,服務器在這種情況下都有足夠的可用資源。
因此,可以使用數據庫連接池來使您的應用程序更快,更具可擴展性。如果你的流量很少,那麼它就不那麼重要了 - 除非你想盡可能快地返回結果。連接池如果經常是整體策略的一部分,以減少延遲並提高整體性能。
可以請你描述php mysql創建連接的方式與節點js連接池不同。 PHP自動處理池請求的數量?哪個更好的nodejs mysql連接池或php的mysql連接? – Rijo