节点查询请求在oracle查询完成执行之前关闭

时间:2019-03-13 18:46:41

标签: node.js oracle

我正在使用node and express和oracle作为我的数据库。我的应用程序运行正常。为了对我的应用程序进行负载测试,我运行Apache ab基准测试。当我尝试并发连接时说100个请求,最后两个请求失败,当我通过记录器调试时,我看到request.on('close')被调用,然后查询完成了执行。仅对于最后的四到五个请求会发生这种情况。有没有办法处理它。我的Oracle池由一个连接组成。我使用node-oracle进行连接。

https://github.com/oracle/node-oracledb

我的代码库是从 https://github.com/oracle/oracle-db-examples/tree/master/javascript/rest-api/part-5-manual-pagination-sorting-and-filtering/hr_app

期望poolMax和poolMin为1。

我运行的Apache Benchmark命令。

ab -k -c 30 -n 200 http://localhost:3000/api/abc/91

在index.js中,我在下面添加了跟踪http请求的状态。它进入关闭代码,然后打印查询执行结果。

const getLoggerForStatusCode = (statusCode) => {
  if (statusCode >= 500) {
    return console.error.bind(console)
  }
  if (statusCode >= 400) {
    return console.warn.bind(console)
  }

  return console.log.bind(console)
}

const logRequestStart = (req, res, next) => {
  req.requestId = token(true).substr(0, 8)

  res.on('timeout', function () {
    console.log("timeout! " + (options.timeout / 1000) + " seconds expired");

    req.destroy();
});

req.on('error', function (err) { 
  console.log('request error'+ error);
});

  console.info(`[${req.requestId}] ${req.method} ${req.originalUrl}`)

  res.setTimeout(5000000, function () {
    // call back function is called when request timed out.
    console.log('server timed out');
  });

  const cleanup = () => {
    res.removeListener('finish', logFn)
    res.removeListener('close', abortFn)
    res.removeListener('error', errorFn)
  }

  const logFn = () => {
    cleanup()
    const logger = getLoggerForStatusCode(res.statusCode)
    logger(`[${req.requestId}] ${res.statusCode} ${res.statusMessage}; ${res.get('Content-Length') || 0}b sent`)
  }

  const abortFn = (err) => {
    cleanup()
    console.warn(`[${req.requestId}] Request aborted by the client ${err}`)
  }

  const errorFn = err => {
    cleanup()
    console.error(`Request pipeline error: ${err}`)
  }

  req.on('finish', logFn) // successful pipeline (regardless of its response)
  req.on('error', errorFn) // pipeline internal error
  req.on('close', abortFn) // aborted pipeline

  next()
}

app.use(logRequestStart);

我确实测量了时间,并且在收到请求的7秒后,连接已关闭。

0 个答案:

没有答案