我正在构建一个节点应用程序,它将查询简单的和更复杂的(多连接)查询。我正在寻找关于我应该如何管理mySQL连接的建议。
我有以下几个要素:
//this is router1 router.get('/', function (req, res){ connection.connect(function(Err){...}); connection.query('SELECT* FROM table WHERE id = "blah"', function(err,results,fields){ console.log(results); }); ... connection.end(); })
我是否应该在每次请求“/router1/”时都连接到mysql,就像本例中那样,还是最好在启动时保持一个连接打开?作为:
connection.connect();
router.get('/',function(req,res){ ... });
null
我使用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;
那么您最好创建一些模型,并在路由器中从控制器中调用这些模型。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。
我希望这有帮助,如果没有,对不起。
连接池应该是这样做的。为每个请求打开一个新连接会减慢应用程序的速度,而且迟早会成为瓶颈,因为node不会像PHP那样自动关闭连接。因此,连接池确保固定数量的连接总是可用的,并且在需要时处理不必要的连接的关闭。
这就是我使用后遗症启动我的express应用程序的方式。对于Mongoose来说,除了库API之外,它或多或少是simlar的。
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');
});
只有在建立了数据库连接后,才会启动应用程序。这可以确保服务器在没有任何数据库连接的情况下不会处于活动状态。默认情况下,连接池将保持连接打开,并为所有查询使用池外的连接。