關(guān)於npm包mysql官方範(fàn)例程式碼的一點(diǎn)疑慮:
首先看第一段程式碼:
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()斷開(kāi)連線;
再看第二段程式碼:
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();
問(wèn)題1 如果這兩段程式碼:
第一段不呼叫
connection.end();
第二段不呼叫
connection.release();
會(huì)產(chǎn)生什麼後果呢?
2、這兩個(gè)有什麼差別呢?
3、這兩段程式碼有什麼差別呢,這個(gè)連線池該怎麼理解呢?
個(gè)人理解:連接池可不可以理解為緩存呢,查詢了某條數(shù)據(jù),第二次查詢相同數(shù)據(jù)直接在緩存裡面去取,也就是池子裡;
1、對(duì)資料庫(kù)的操作一定是同步阻塞的,因?yàn)闆Q不允許多個(gè)連接同時(shí)操作一條記錄這種情況的發(fā)生,想要操作資料庫(kù),必須先建立連接,而資料庫(kù)也不允許無(wú)限制的建立多個(gè)連接,如果某個(gè)連接操作完未斷開(kāi)或釋放連接,就會(huì)影響到後續(xù)連接的建立和使用,這對(duì)於高並發(fā)的情況是需要避免的。
2、connection.end()和 connection.release()的作用都是釋放當(dāng)前連接,但物件不同,前者針對(duì)的是普通的連接,而後者針對(duì)的連接池。
3、連接池確實(shí)有緩存的作用,但是其緩存的不是某條操作取出的具體數(shù)據(jù),而是緩存的連接本身,這樣當(dāng)下次操作數(shù)據(jù)庫(kù)時(shí)就不再需要不停的建立連接和銷毀連接了。