gpt4 book ai didi

mysql - TypeORM with MySQL Error : Pool is closed. 调用数据库时测试卡住了

转载 作者:行者123 更新时间:2023-12-04 03:56:20 28 4
gpt4 key购买 nike

我们在 TypeORM 方面遇到了一个奇怪的问题,特别是 Jest(可能相关,也可能不相关)。某个测试完全卡住/挂起,我们很难弄清楚问题出在哪里。
在堆栈方面:Typescript, NodeJS, Apollo Graphql, Jest, MySQL .
有问题的测试实际上是使用 Apollo 集成测试框架的集成测试。
首先发生的是一个特定的测试完全卡住了,几分钟后控制台抛出一个错误:QueryFailedError: ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction试图查明问题使我找到了我们在 afterEach 上运行的函数这会“破坏”数据库。它最初运行:

await queryRunner.query('DELETE FROM Table1');
await queryRunner.query('DELETE FROM Table2');
...
在我从 queryRunner 更改它后,错误和“死锁”最初得到修复。至 queryBuilder :
await queryBuilder.delete().from('Table1').execute();
...
这是在与 SHOW PROCESSLIST; 坐立不安之后完成的并与 SHOW ENGINE InnoDB STATUS;尝试弄清楚发生了什么。我还将事务隔离更改为 READ-COMMITTED 但无济于事。除了从 queryRunner 更改它之外,没有什么真正有效的至 queryBuilder .
这有点奏效,但现在似乎测试又卡住了(测试没有改变,但它正在测试的代码 )。现在测试挂起后,我们得到这个错误: Error: Pool is closed .之后测试被“发布”,所有的测试都开始一个一个地失败。
我们发现这是导致测试卡住的事件序列:
1. open a transaction with queryRunner
2. perform a read query
3. then perform a write
4. commit the transaction and release the queryRunner
5. delete the DB
6. perform a write - deadlock
此外,我们注意到以下几点:

If we make sure that we only use the queryRunner for updates, and notfor queries, then the deadlock doesn’t happen.

Changing the code such that we first make all of the read queries with the regular connectionobject (not queryRunner) and only then if we connect withqueryRunner and make all of the writes - then the deadlock does not happen.


有没有人对可能发生的事情有任何见解? queryRunner 是否存在一些不稳定性或者我们在使用它时需要考虑的一些特定事项?
谢谢!

最佳答案

我遇到了同样的问题,我的问题是未处理的 async/await。
检查是否未处理某些 promise 对象。
如果使用 async 关键字,则必须使用 await 关键字处理所有异步函数。
也不要忘记调用 done jest的方法.

关于mysql - TypeORM with MySQL Error : Pool is closed. 调用数据库时测试卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63827689/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com