在后端使用 node-oracledb 管理来自前端的请求

Managing requests from Front-End with node-oracledb in backend

我正在编写一个连接到数据库的新方法,运行s SQL 每次从前端发出请求时查询并关闭该连接。对于我想要 运行 的每个查询,都会一次又一次地建立和关闭数据库连接。这会影响性能吗?这是正确的方法还是有更好的方法?

app.post('/register', (req, res) =>{
  registerDb().then(resp => {
    res.json({"message" : resp})})
    .catch(err => {
      console.log(err);
    })
})

app.post('/signin', (req, res) => {
  checkAuth(req.body).then(response => {
    res.send(response);
  })
  .catch(err => {
    console.log(err);
  });
})

app.listen(4000);

async function registerDb() {
  let conn;
  try {
    conn = await oracledb.getConnection(config)
    let result = await conn.execute(
      `INSERT INTO "User" VALUES (name, email, id, password, age)`,
    );
    console.log("Rows inserted: " + result.rowsAffected);  // 1
    console.log("ROWID of new row: " + result.lastRowid);
    return result.rowsAffected;
  } catch (err) {
    console.log('Ouch!', err)
    return err.message;
  } finally {
    if (conn) { // conn assignment worked, need to close
      await conn.close()
    }
  }
}

async function checkAuth(data) {
  let conn;

  try {
  
    conn = await oracledb.getConnection(config)

    let result = await conn.execute(
      `Select name 
      from "User"
      where email = :email and password = :password`,
      {
        email : {val: data.email},
        password: {val: data.password}
      }
    );

    return result.rows;

  } catch (err) {
    console.log('Ouch!', err)
    return err.message;
  } finally {
    if (conn) { // conn assignment worked, need to close
      await conn.close()
    }
  }
}

打开和关闭与数据库的连接会影响性能。需要在数据库主机上启动一个进程,必须分配和初始化内存。而在连接关闭时则相反。由于这些是新连接,因此它们无法重用某些缓存数据来执行语句。

来自node-oracledb pooling documentation:

When applications use a lot of connections for short periods, Oracle recommends using a connection pool for efficiency.

查看该手册,并查看 webapp.js.

等示例

确保为打开多个连接的应用增加 UV_THREADPOOL_MAX。