搜索

首页  >  问答  >  正文

javascript - mysql模块的一些问题,关于连接池的

关于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、这两段代码有什么区别呢,这个连接池该怎么理解呢?
个人理解:连接池可不可以理解为缓存呢,查询了某条数据,第二次查询相同数据直接在缓存里面去取,也就是池子里;

淡淡烟草味淡淡烟草味2746 天前553

全部回复(1)我来回复

  • phpcn_u1582

    phpcn_u15822017-05-19 10:10:39

    1、对数据库的操作一定是同步阻塞的,因为决不允许多个连接同时操作一条记录这种情况的发生,想要操作数据库,必须要先建立连接,而数据库也不允许无限制的建立多个连接,如果某个连接操作完不断开或释放连接,就会影响到后续连接的建立和使用,这对于高并发的情况是需要避免的。
    2、connection.end()和 connection.release()的作用都是释放当前连接,但对象不同,前者针对的是普通的连接,而后者针对的连接池。
    3、连接池确实有缓存的作用,但是其缓存的不是某条操作取出的具体数据,而是缓存的连接本身,这样当下次操作数据库时就不再需要不停的建立连接和销毁连接了。

    回复
    0
  • 取消回复