Javascript 关闭节点中的MSSQL连接
我正在使用Electron应用程序中的节点连接SQL Server。Javascript 关闭节点中的MSSQL连接,javascript,node.js,sql-server,Javascript,Node.js,Sql Server,我正在使用Electron应用程序中的节点连接SQL Server。 我无法创建RESTAPI 它工作正常,但我有顾虑: 它不会在查询后关闭SQL连接 它为每个查询建立一个新的数据库连接 可以吗? 工作原理: app.js进行2次查询并记录结果 sql.js连接数据库 // app.js const { getUser, getUsers } = require('./sql'); getUser(10).then((result) => { console.dir(resu
我无法创建RESTAPI 它工作正常,但我有顾虑:
- 它不会在查询后关闭SQL连接
- 它为每个查询建立一个新的数据库连接
app.js
进行2次查询并记录结果sql.js
连接数据库
// app.js
const { getUser, getUsers } = require('./sql');
getUser(10).then((result) => {
console.dir(result);
});
getUsers.then((result) => {
console.dir(result);
})
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
// Creates new connection pool for each query
function connectDB() {
const pool = new sql.ConnectionPool(config);
return pool.connect()
.then(pool => {
console.log('Connected to database');
// returns Promise
return pool;
})
.catch(err => console.log('Database connection failed!', err));
}
// 1st query
function getUser(id) {
const connection = connectDB();
return connection
.then(pool => {
return pool.request()
.input('PK_ID', sql.Int, parseInt(id))
.execute('[uspGetUser]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.log('Query failed!', err);
});
}
// 2nd query
function getUsers() {
const DB = connectDB();
return DB
.then(pool => {
return pool.request()
.execute('[uspGetUsers]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.log('Query failed!', err);
});
}
module.exports = {
getUser,
getUsers
}
解决了
要关闭数据库连接并返回结果,我们可以使用finally语句和asnyc/await函数
finally语句允许您在try和catch之后执行代码,而不管结果如何
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
async function connectDB() {
const pool = new sql.ConnectionPool(config);
try {
await pool.connect();
console.log('Connected to database');
return pool;
}
catch(err) {
console.log('Database connection failed!', err);
return err;
}
}
async function getAll() {
const DB = await connectDB();
try {
const result = await DB.request()
.query('select * from [your_table]');
return result.recordset;
}
catch (err) {
console.log('Error querying database', err);
return err;
}
finally {
DB.close();
}
}
async function execute() {
let result = await getAll();
console.dir(JSON.stringify(result));
return result;
}
execute();
不,您不需要在每次查询后
关闭
a.k.a.释放
到连接池的连接。图书馆已经为你做了
pool.close()
方法将关闭池中的所有连接。从技术上讲,您应该只在终止应用程序时才这样做,而不是在每次查询之后,因为每次创建一个新池都会给应用程序带来相当大的开销
我自己也有同样的问题,所以我查阅了项目的。我可以用
newpromise
和resolve
结果包装查询,然后关闭连接。它是有效的(但这是最好的方法吗?),我们如何保持一个db连接的活力。而不是为每个请求创建连接