【问题标题】:How to add a request timeout in Typeorm/Typescript?如何在 Typeorm/Typescript 中添加请求超时?
【发布时间】:2020-09-14 14:22:58
【问题描述】:

今天,Typeorm(Postgres)的行为

  • getManager().query(...)
  • getRepositoty().createQueryBuilder(...).getMany()

就是无限期地等待响应。

有没有办法引入我可能错过的请求超时?

如果这不可能,Typeorm 是否会从其池中公开连接,以便我可以实现超时机制并手动关闭数据库连接?

【问题讨论】:

    标签: typescript postgresql typeorm


    【解决方案1】:

    要使用池中的特定连接,请使用 createQueryRunner,文档中没有关于它的信息,但它记录在 api 中。

    创建一个查询运行器,用于在单个数据库连接上执行查询。 使用查询运行器,您可以控制查询以使用单个数据库连接和 手动控制您的数据库事务。

    使用示例:

    const foo = <T>(callback: <T>(em: EntityManager) => Promise<T>): Promise<T> => {
        const connection = getConnection();
        const queryRunner = connection.createQueryRunner();
    
        return new Promise(async (resolve, reject) => {
            let res: T;
            try {
                await queryRunner.connect();
                // add logic for timeout
                res = await callback(queryRunner.manager);
            } catch (err) {
                reject(err);
            } finally {
                await queryRunner.release();
                resolve(res);
            }
        });
    };
    
    

    【讨论】:

    • 谢谢你这很聪明。这也适用于存储库吗?
    • Repository 接口有一个 queryRunner 成员,您可以类似地使用它。据我了解,它的管理方式相同,应该可以正常工作。
    【解决方案2】:

    from the documentation 你可以使用maxQueryExecutionTime ConnectionOption。

    maxQueryExecutionTime - 如果查询执行时间超过给定的最大执行时间(以毫秒为单位),那么记录器将记录此查询。

    ConnectionOptions 是您传递给createConnection 或在ormconfig 中定义的连接配置

    【讨论】:

    • 来自文档:connectTimeoutMS - 在与 postgres 服务器的初始连接期间发生超时前的毫秒数。这不是问题。问题是关于请求超时而不是连接超时。
    • 你能重新检查我的答案吗?
    • 再次阅读(并尝试) maxQueryExecutionTime 并没有做我实际需要做的事情。它不会超时,它只会在响应时间超过 maxQueryExecutionTime 时间时记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多