作者:阿日小子很顽强_756 | 来源:互联网 | 2022-12-20 19:23
我有一个像这样的路由器文件:
import express from 'express';
import health from './health';
import surface from './surface';
const router = express.Router();
router.use('/health', health);
router.use('/surface', surface);
router.get('*', (req, res) => {
res.status(404);
res.json({
message: 'Uknown API endpoint'
});
});
export default router;
在每个路由中,我使用NPM mysql
包创建连接,然后在我打电话之前结束它res.send()
.IIRC创建连接并以每个查询结束它将是一个坏主意.
我试过做中间件,如:
router.use((req, res, next) => {
next();
mySingletonWrappingMysql.connection.end();
});
鉴于我的路线正在做异步事情,endConnection
呼叫过早发生.next
是不是真的异步,所以我做不到await next
,我甚至不确定这将是正确的方式/地方去做.此示例使用单例,因为我也不确定如何正确设置要在路径中使用的新实例.req.param
似乎是一个不是最佳原因的选项,似乎是特殊查询param vars.
1> O. Jones..:
您需要一个到MySQL的连接池.这是一个可串行重用的连接资源池.你需要的时候抓住一个,当你完成后就把它拿走.因此,每个请求,甚至每个中间件调用,都可以使用连接而不必担心并发(这对连接不起作用).看到这个.https://www.npmjs.com/package/mysql#pooling-connections
像这样设置你的游泳池,只需一次.每个node.js服务器实例都需要一个池,用于它使用的每个单独的MySQL服务器.
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
此createPool操作创建一个最多包含十个连接的池.每次使用池时,它都会检查其所有连接是否都很忙.如果没有,它会让你空闲使用.如果他们都忙,它会打开一个新的.但是,如果池中已经有connectionLimit
连接使用,它将等待一个空闲.
然后随意的一次性查询就像这样工作.在REST服务器中,您可能会发现对数据库的单个查询可以满足某些GET查询.这些都非常简单.没有必要明确地从池中获取或释放连接.并且,当您释放连接时,它将保持与DBMS的连接,以备将来的请求使用.如果满足特定请求需要两个或三个SELECT查询,您也可以使用此技术.但是,每个查询可能使用池中的不同连接.
pool.query('SELECT whatever FROM whatever',
function (error, results, fields) {
if (error) throw error;
/* handle your results array */
})
如果你需要为多个查询获取连接,它几乎一样简单,但你需要在完成后记住release()
连接.当您的某些查询依赖于序列中先前查询的结果时,您需要执行此操作.
pool.getConnection(function(err, connection) {
if (error) throw error;
connection.query('INSERT INTO sometable ...',
function (error, results, fields) {
if (error) {
connection.release();
throw error;
}
connection.query('INSERT INTO detail ... (LAST_INSERT_ID()...)',
function (error, results, fields) {
connection.release();
if (error) throw error;
});
});
});
您可能希望使用promises来避免函数嵌套,尤其是在您想要运行一系列查询时.