關於npm包mysql官方範例程式碼的一點疑慮:
首先看第一段程式碼:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[ 0].solution);
});
connection.end();
可以看到查詢後,呼叫connection.end()斷開連線;
再看第二段程式碼:
var mysql = require('mysql') ;
var pool = mysql.createPool(...);
pool.getConnection(function(err, connection) {
// Use the connection
connection.query('SELECT something FROM sometable', function (error, results, fields) {
// And done with the connection.
connection.release();
// Handle error after the release.
if (error) throw error;
// Don't use the connection here, it has been returned to the pool.
});
});
這裡面查詢完成後呼叫: connection.release();
問題1 如果這兩段程式碼:
第一段不呼叫
connection.end();
第二段不呼叫
connection.release();
會產生什麼後果呢?
2、這兩個有什麼差別呢?
3、這兩段程式碼有什麼差別呢,這個連線池該怎麼理解呢?
個人理解:連接池可不可以理解為緩存呢,查詢了某條數據,第二次查詢相同數據直接在緩存裡面去取,也就是池子裡;
1、對資料庫的操作一定是同步阻塞的,因為決不允許多個連接同時操作一條記錄這種情況的發生,想要操作資料庫,必須先建立連接,而資料庫也不允許無限制的建立多個連接,如果某個連接操作完未斷開或釋放連接,就會影響到後續連接的建立和使用,這對於高並發的情況是需要避免的。
2、connection.end()和 connection.release()的作用都是釋放當前連接,但物件不同,前者針對的是普通的連接,而後者針對的連接池。
3、連接池確實有緩存的作用,但是其緩存的不是某條操作取出的具體數據,而是緩存的連接本身,這樣當下次操作數據庫時就不再需要不停的建立連接和銷毀連接了。