问题描述
今天,Typeorm(Postgres)的行为
-
getManager().query(...)
和 -
getRepositoty().createQueryBuilder(...).getMany()
是无限期地等待响应。
有没有办法引入我可能会错过的请求超时?
如果这不可能,那么Typeorm是否会从其池中公开连接,以便我可以实现超时机制并手动关闭数据库连接?
解决方法
要使用池中的特定连接,请使用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);
}
});
};
,
from the documentation,您可以使用maxQueryExecutionTime
ConnectionOption。
maxQueryExecutionTime
-如果查询执行时间超过了给定的最大执行时间(以毫秒为单位),则记录器将记录该查询。
ConnectionOptions是您传递给createConnection
或在ormconfig
中定义的连接配置