在 Node.js 中管理数据库连接,最佳实践?
Posted
技术标签:
【中文标题】在 Node.js 中管理数据库连接,最佳实践?【英文标题】:Managing database connections in Node.js, best practices? 【发布时间】:2018-08-23 12:15:12 【问题描述】:我正在构建一个 Node 应用程序,它将查询简单和更复杂(多连接)的查询。我正在寻找有关如何管理 mysql 连接的建议。
我有以下元素:
server.js : 快递 router1.js(虚构名称):Express Router 中间件 router2.js(虚构名称):Express Router 中间件 //这是路由器1 router.get('/', function (req, res) 连接.连接(函数(错误)...); connection.query('SELECT* FROM table WHERE id = "blah"', function(err,results,fields) 控制台.log(结果); ); ... 连接.end(); )每次请求“/router1/”时我应该连接到 mysql,就像在这个例子中一样,还是最好在启动时打开一个连接?如:
connection.connect();外部:
router.get('/',function(req,res) ... );?
【问题讨论】:
我认为最好的方法不是留下打开的连接,而是使用连接池,以便可以重复使用连接。这是a link 如何连接连接。这是a good article,提供更多信息。 第一次打开连接时,会根据连接字符串创建一个连接池。在我们关闭一个连接后,连接返回到池中。当我们用相同的连接字符串打开另一个连接时,池化器会查看池中是否有可用的连接。如果池连接可用,则将其返回给调用者,而不是打开新连接。建议关闭连接或在 using 块内打开连接。这样,连接将被返回到池中以供将来重用 【参考方案1】:> npm install mysql
mysql 是一个很棒的模块,它使使用 MySQL 变得非常容易,它提供了您可能需要的所有功能。
一旦你安装了mysql,你所要做的就是连接到你的数据库
var mysql = require('mysql')
var conn = mysql.createConnection(
host: 'localhost',
user: 'username',
password: 'password',
database: 'database'
)
conn.connect(function(err)
if (err) throw err
console.log('connected')
)
现在您已准备好开始写入和读取数据库。
【讨论】:
【参考方案2】:我为此使用 mysql2,它基本上是 mysql,但有承诺。如果你使用mysql,你也可以这样做。
创建一个名为 connection.js 或其他东西的单独文件。
const mysql = require('mysql2');
const connection = mysql.createPool(
host: "localhost",
user: "",
password: "",
database: ""
// here you can set connection limits and so on
);
module.exports = connection;
那么你最好创建一些模型并在你的控制器中调用它们,在你的router.get('/', (req, res) => here);
中
模型如下所示:
const connection = require('../util/connection');
async function getAll()
const sql = "SELECT * FROM tableName";
const [rows] = await connection.promise().query(sql);
return rows;
exports.getAll = getAll;
你可以在有或没有承诺的情况下做到这一点,没关系。 查询完成后,您与池的连接会自动释放。 然后你应该从你的路由器或应用程序调用 getAll。
希望对您有所帮助,如果没有,请见谅。
【讨论】:
【参考方案3】:连接池是应该怎么做的。为每个请求打开一个新连接会减慢应用程序的速度,它迟早会成为瓶颈,因为节点不会像 php 那样自动关闭连接。因此,连接池确保固定数量的连接始终可用,并在需要时处理关闭不必要的连接。
这就是我使用 Sequelize 启动我的 express 应用程序的方式。对于 Mongoose,除了库 API 之外,它或多或少是相似的。
const sequelize = new Sequelize('database', 'username', 'password',
host: 'localhost',
dialect: 'mysql',
pool:
max: 5,
min: 0,
acquire: 30000,
idle: 10000
);
sequelize.authenticate()
.then(
// On successfull connection, open a port
// and listen to requests. This is where the application
// starts listening to requests.
() =>
const server = http.createServer(app);
server.listen(port);
,
)
.catch(err =>
console.error('Unable to connect to the database:', err);
console.error('Cancelling app server launch');
);
只有在建立数据库连接后才会启动应用程序。这可确保服务器在没有任何数据库连接的情况下不会处于活动状态。连接池将默认保持连接打开,并使用池外的连接进行所有查询。
【讨论】:
以上是关于在 Node.js 中管理数据库连接,最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
与 mongoose/node.js 共享数据库连接参数的最佳方式