如何使用 node.js 和连接池同时建立多个到 SQLServer 数据库的连接?
How to make multiple connections at once to a SQLServer database by using node.js and connection pooling?
我正在使用池连接构建一个带有 SQLServer 数据库的 node.js 应用程序。它具有异步功能,每个人都应该在完成后将一条记录保存到数据库中。问题是只插入了 10 个异步任务中的大约 10 条记录,其余的给出了这个错误 "Already connecting to database! Call close before connecting to different database.".
我尝试编辑池的配置,但没有成功。
var config = {
host: "localhost",
user: "test",
password: "test",
database: "testDB",
server: '************',
pool: {
max: 20,
maxWaitingClients:1,
fifo:true,
min: 0,
idleTimeoutMillis: 30000
}
};
const pool = new sql.ConnectionPool(config);
pool.on('error', err => {
console.error('SQLServer Pool Error: ', err.toString());
});
async writeToDB(System, url, PortListening, RequestTest, time, TestType, Request, Response, responseTime, pool) {
try {
var query = "INSERT INTO `testTable` " +
"(SystemName,URL,PortListening,RequestTest,TestDate,TestType,Request,Response,ResponseTime) " +
"VALUES " +
"('" + System + "','" + url + "','" + PortListening + "','" + RequestTest + "','" + time + "','" + TestType + "',N'" + Request + "',N'" + Response + "'," + responseTime + ")";
await pool.connect();
let result =await pool.request().query(query);
return {success: result};
} catch (err) {
console.log(System);
console.error(err);
return {err: err};
} finally {
pool.close();
}
}
它应该插入所有异步任务中的所有行而不会丢失任何数据。
从池设置中省略 maxWaitingClients。让客户端自动处理。
我找到了答案。我应该在应用程序启动时打开池 "pool.connect()" 一次,然后在应用程序关闭之前将其关闭。所以代码应该是这样的:
var config = {
host: "localhost",
user: "test",
password: "test",
database: "testDB",
server: '************',
pool: {
max: 20,
maxWaitingClients:1,
fifo:true,
min: 0,
idleTimeoutMillis: 30000
}
};
const pool = new sql.ConnectionPool(config);
pool.on('error', err => {
console.error('SQLServer Pool Error: ', err.toString());
});
pool.connect();
async writeToDB(System, url, PortListening, RequestTest, time, TestType, Request, Response, responseTime, pool) {
try {
var query = "INSERT INTO `testTable` " +
"(SystemName,URL,PortListening,RequestTest,TestDate,TestType,Request,Response,ResponseTime) " +
"VALUES " +
"('" + System + "','" + url + "','" + PortListening + "','" + RequestTest + "','" + time + "','" + TestType + "',N'" + Request + "',N'" + Response + "'," + responseTime + ")";
let result =await pool.request().query(query);
} catch (err) {
return {err: err};
}
}
我正在使用池连接构建一个带有 SQLServer 数据库的 node.js 应用程序。它具有异步功能,每个人都应该在完成后将一条记录保存到数据库中。问题是只插入了 10 个异步任务中的大约 10 条记录,其余的给出了这个错误 "Already connecting to database! Call close before connecting to different database.".
我尝试编辑池的配置,但没有成功。
var config = {
host: "localhost",
user: "test",
password: "test",
database: "testDB",
server: '************',
pool: {
max: 20,
maxWaitingClients:1,
fifo:true,
min: 0,
idleTimeoutMillis: 30000
}
};
const pool = new sql.ConnectionPool(config);
pool.on('error', err => {
console.error('SQLServer Pool Error: ', err.toString());
});
async writeToDB(System, url, PortListening, RequestTest, time, TestType, Request, Response, responseTime, pool) {
try {
var query = "INSERT INTO `testTable` " +
"(SystemName,URL,PortListening,RequestTest,TestDate,TestType,Request,Response,ResponseTime) " +
"VALUES " +
"('" + System + "','" + url + "','" + PortListening + "','" + RequestTest + "','" + time + "','" + TestType + "',N'" + Request + "',N'" + Response + "'," + responseTime + ")";
await pool.connect();
let result =await pool.request().query(query);
return {success: result};
} catch (err) {
console.log(System);
console.error(err);
return {err: err};
} finally {
pool.close();
}
}
它应该插入所有异步任务中的所有行而不会丢失任何数据。
从池设置中省略 maxWaitingClients。让客户端自动处理。
我找到了答案。我应该在应用程序启动时打开池 "pool.connect()" 一次,然后在应用程序关闭之前将其关闭。所以代码应该是这样的:
var config = {
host: "localhost",
user: "test",
password: "test",
database: "testDB",
server: '************',
pool: {
max: 20,
maxWaitingClients:1,
fifo:true,
min: 0,
idleTimeoutMillis: 30000
}
};
const pool = new sql.ConnectionPool(config);
pool.on('error', err => {
console.error('SQLServer Pool Error: ', err.toString());
});
pool.connect();
async writeToDB(System, url, PortListening, RequestTest, time, TestType, Request, Response, responseTime, pool) {
try {
var query = "INSERT INTO `testTable` " +
"(SystemName,URL,PortListening,RequestTest,TestDate,TestType,Request,Response,ResponseTime) " +
"VALUES " +
"('" + System + "','" + url + "','" + PortListening + "','" + RequestTest + "','" + time + "','" + TestType + "',N'" + Request + "',N'" + Response + "'," + responseTime + ")";
let result =await pool.request().query(query);
} catch (err) {
return {err: err};
}
}