如何在TypeORM Nodejs中为MariaDB连接设置socketTimeOut

sh7euo9m  于 2023-05-06  发布在  Node.js
关注(0)|答案(1)|浏览(210)

bounty还有2天到期。回答此问题可获得+50声望奖励。Abhishek Jain希望引起更多关注这个问题。

我们希望在某个阈值之后使查询超时。我们尝试在下面的代码片段中的多个位置添加socketTimeout标志。它不适用于NodeJS中的TypeORM框架的MariaDB。请帮帮我

const { createConnection } = require("typeorm");
const mariadb = require("mariadb");

async function main() {
  const connection = await createConnection({
  type: 'mariadb',
  host: 'hostname',
  port: 3306,
  username: 'db username',
  password: 'db password',
  database: 'db name',
  connectTimeout: 5000, // 5 seconds
  socketTimeout: 10, 
    extra: {
    socketTimeout: 10, 
    queryTimeout: 10
  }
  });

  // use the connection here
  const results = await connection.query('query string');
  console.log(results);
}

main().catch((error) => {
  console.error(error);
});
68bkxrlz

68bkxrlz1#

通过这种配置,您实际上将使用mysql或mysql2连接器。
mysql和mysql2连接器不允许查询超时。mariadb连接器可以,但经过验证,由于https://jira.mariadb.org/browse/CONJS-249的原因,它实际上与typeorm不兼容(这将在下一个3.1.2版本中纠正)。

driver: mariadb,
  ...
  extra: {
    queryTimeout: 10
  }

因此,如果您使用mariadb服务器,实际上只有2种解决方法在创建连接后,您可以使用以下命令指示查询默认超时:

SET max_statement_time=
    await connection.query('SET max_statement_time=x'); // x being the timeout in seconds

或每个查询前置查询“SET STATEMENT max_statement_time=x”,如

const results = await connection.query('SET STATEMENT max_statement_time=5 FOR SELECT SLEEP (10)');

编辑:自3.1.2版本以来,可以使用以下命令完成:

const { createConnection } = require("typeorm");
const mariadb = require("mariadb/callback");

async function main() {
    const connection = await createConnection({
        type: 'mariadb',
        driver: mariadb,
        host: 'localhost',
        port: 3306,
        username: 'root',
        database: 'testj',
        connectTimeout: 5000, // 5 seconds
        extra: {
            queryTimeout: 10000 // 10 seconds
        }
    });
    // use the connection here
    const results = await connection.query('SELECT SLEEP (10)');
    // or using specific timeout for a query: 
    // const results = await connection.query({ sql: 'SELECT SLEEP (10)', timeout: 5000});
    
    console.log(results);
}

main().catch((error) => {
    console.error(error);
});

相关问题