该文章分享的js代码不适用于生成环境使用。
在生产环境中,后端服务对数据库连接的管理都是通过一个 数据库连接池。
在接口需要获取数据库数据的时候,从池中取一个活跃连接,到数据库取完数据/执行数据变更操作后,释放连接并放回连接池。
上图所示,当业务线程处理数据时,使用连接;右边为业务处理结束,释放连接,放回连接池中。
这里分享一个连接池的JS代码
const mysql = require("mysql"); const port = 3306 //创建数据库连接池,连接到指定IP const pool = mysql.createPool({ host: 'localhost', port: port, user: 'root', password: '12345678', database: 'demo20210330', multipleStatements: true }); // 定义sql执行函数 // 并允许用户输入连接执行成功的回调函数onSuccess,以及错误回调onError const runSql = function(sql, onSuccess, onError) { pool.getConnection(function(err, conn) { if (err) { onError(err); return; } conn.query(sql, function(err, data) { try { if (err) { onError(err); } else { onSuccess(data); } } catch(err) { onError(err); } finally { console.log('release connection'); conn.release(); } }); }); }; //查看池的状态 const showPool = function() { console.log('pool: ', pool); }; module.exports.show = showPool; module.exports.runSql = runSql;
这个工具JS库runSql函数中每次执行SQL,最后不管结果如何,总会在finally内释放链接,达到了连接自动回收的作用。
PS:上面的数据库配置密码过于简单,实际环境建议改复杂点(推荐:通过环境配置来解密数据库密码)。
保存代码为dbpool.js, 进入Node终端;然后输入以下代码并查看结果:
var pool = require('./dbpool')
pool.runSql("select * from company;", (e)=>console.log(e)
PS:下面的数据库在前一篇文章中提前创建好了
输入pool.show() 查看连接池状态, 比如连接信息,空闲的数据库连接等。
注意事项:连接池的连接不要手动去调用destroy(销毁连接)。
连接池的作用
因为销毁连接,当业务需要的时候调用数据库获取数据的时候,需要重新建立连接(TCP连接),这个过程开销是很大的。
相比之下,维持一个长连接省去很多建立重连TCP的时间。
起到了缓冲作用,而且所有数据库连接都会在缓存池里被统一管理。
上文是MySQL JS库自带的连接池,普通应用开发上面的足够,在Github上还有一个通用连接池项目:https://github.com/coopernurse/node-pool