利用连接池的正确方法

时间:2017-09-20 05:05:58

标签: javascript sql-server node.js sockets

我目前正在开发一个服务器,其中一个功能是在客户端提供databasequerycredentials等时从服务器检索数据。我也在使用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

因此,我无法在按钮点击之前创建连接池,因为它们是从客户端提供的

  

如何解决此连接池问题,以便我可以使用客户端提供的数据配置数据库连接,同时重复使用与多个端点用户相同的池?

0 个答案:

没有答案