关于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、这两段代码有什么区别呢,这个连接池该怎么理解呢?
个人理解:连接池可不可以理解为缓存呢,查询了某条数据,第二次查询相同数据直接在缓存里面去取,也就是池子里;
phpcn_u15822017-05-19 10:10:39
1、对数据库的操作一定是同步阻塞的,因为决不允许多个连接同时操作一条记录这种情况的发生,想要操作数据库,必须要先建立连接,而数据库也不允许无限制的建立多个连接,如果某个连接操作完不断开或释放连接,就会影响到后续连接的建立和使用,这对于高并发的情况是需要避免的。
2、connection.end()和 connection.release()的作用都是释放当前连接,但对象不同,前者针对的是普通的连接,而后者针对的连接池。
3、连接池确实有缓存的作用,但是其缓存的不是某条操作取出的具体数据,而是缓存的连接本身,这样当下次操作数据库时就不再需要不停的建立连接和销毁连接了。