我目前正在开发一个服务器,其中一个功能是在客户端提供database
,query
,credentials
等时从服务器检索数据。我也在使用socket.io
一次从服务器流式传输100行。
由于我不确定在峰值时会立即向数据库发出多少并发请求,因此我使用connectionPool
节点模块设置了mssql
。下面简洁地说明了我的代码是什么样的。
socket.on('request:database', (connectionConf) => {
let query = connectionConf.query;
let dbAddress = connectionConf.dbAddress;
let id = connectionConf.id;
let password = connectionConf.password;
let dbName = connectionConf.dbName;
let requestedRows = parseInt(connectionConf.noOfRows);
let createExcel = connectionConf.excel;
const sqlConfig = {
user: id,
password: password,
server: dbAddress,
database: dbName,
pool: {
max: 1,
min: 0,
idleTimeoutMillis: 30000
},
options: {
encrypt: true,
}
};
let connectionPool = new sql.ConnectionPool(sqlConfig, err =>
request.stream = true;
request.query(query);
request.on('recordset', columns => {
//run functions with columns
socket.emit('response:headers', //send results);
// Emitted once for each recordset in a query
});
request.on('row', row => {
//Run some functions
socket.emit('result', //send 100 rows at a time);
// Emitted for each row in a recordset
});
)
});
在上面的代码中,每次客户端进行查询时都会触发request:database
socket.io
事件。问题是我没有正确使用池,因为每次客户端点击发送查询按钮时我都会创建新的connectionPool
。
因此,我无法在按钮点击之前创建连接池,因为它们是从客户端提供的
如何解决此连接池问题,以便我可以使用客户端提供的数据配置数据库连接,同时重复使用与多个端点用户相同的池?