安装驱动
Node 连接 MySQL 首先需要安装 MySQL 驱动
npm install --save mysql
连接数据库
连接数据库的方式很简单
- 初始化配置,获得连接实例
- 调用实例的.connect()方法
- 查询数据
- 关闭连接
代码如下:
const mysql = require('mysql'); // mysql node driver
const mysqlConfig = require('../secret/mysql.config'); // mysql配置文件
const console = require('tracer').colorConsole(); // 增强console
// 初始化数据库配置, mysql端口号默认为3306
const connection = mysql.createConnection({
host: mysqlConfig.host,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database,
});
// 连接数据库
connection.connect(function (err) {
if (err) {
console.error('error connecting: ', err);
}
console.debug('connected id is', connection.threadId);
});
connection.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
}
console.debug('results', results);
});
connection.end();
为了安全性考虑,这里讲数据库的用户名和密码信息保存在单另的一个js文件里,如下:
连接池
如果不想程序在查询数据时卡死或等待过长时间,一般不推荐在node中开启一个连接后全部查询都用这个链接并且不关闭,因为,你试了就知道为什么了
连接池是必要的,因为只用一个单连接操作数据库会出现一些问题,比如每次查询都要建立连接然后再关闭?建立连接和断开连接会有性能开销的,而且如果只有一个连接实例,并发的时候就傻了
所以连接池是非常必要的
建立连接池
建立连接池很简单,只需要将mysql.createConnection
方法改为mysql.createPool
方法即可,可以在初始化的时候加一个connectionLimit
参数(一次创建的最大连接数。 (默认值:10))
const mysql = require('mysql'); // mysql node driver
const mysqlConfig = require('../secret/mysql.config'); // mysql配置文件
const console = require('tracer').colorConsole(); // 增强console
// 初始化数据库配置,建立连接池 mysql端口号默认为3306
const pool = mysql.createPool({
connectionLimit: 10, // 连接数量
host: mysqlConfig.host,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database,
});
// 直接使用 pool.query
pool.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
});
// 通过 pool.getConnection 获得链接
pool.getConnection(function (err, connection) {
if (err) {
console.error(err);
return;
}
connection.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
connection.release(); // 释放该链接,把该链接放回池里供其他人使用
// connection.destroy(); // 如果要关闭连接并将其从池中删除,请改用connection.destroy()。该池将在下次需要时创建一个新的连接。
});
});
查询的方式有两种:
一种是简单的直接使用
pool.query
,这种方式的优点是简单,且可以自动回收connection
另一种是使用
pool.getConnection
获得特定的connection
,再进行查询
他们两的主要区别是:
参考文章:node.js中mysql连接池的使用
pool.getConnection获取到的connection在其回调函数中是一致的,可以保证系列查询在同一个connection上依次串行执行;pool.query每次调用则可能在不同的connection上执行查询
直接用 pool.query 每次都随机分配 connection。当有些操作需要保证是同一 connection 的时候,就独立使用 pool.getConnection吧
所以结论是,大部分时间用 pool.query 就行了,当有些操作需要保证是同一 connection 的时候,就独立使用 pool.getConnection