javascript - mysql模組的一些問題,關於連接池的
淡淡烟草味
淡淡烟草味 2017-05-19 10:08:39
0
1
571

關於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)
phpcn_u1582

1、對資料庫的操作一定是同步阻塞的,因為決不允許多個連接同時操作一條記錄這種情況的發生,想要操作資料庫,必須先建立連接,而資料庫也不允許無限制的建立多個連接,如果某個連接操作完未斷開或釋放連接,就會影響到後續連接的建立和使用,這對於高並發的情況是需要避免的。
2、connection.end()和 connection.release()的作用都是釋放當前連接,但物件不同,前者針對的是普通的連接,而後者針對的連接池。
3、連接池確實有緩存的作用,但是其緩存的不是某條操作取出的具體數據,而是緩存的連接本身,這樣當下次操作數據庫時就不再需要不停的建立連接和銷毀連接了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板