drogonframework / drogon

Drogon: A C++14/17/20 based HTTP web application framework running on Linux/macOS/Unix/Windows
MIT License
11.52k stars 1.1k forks source link

use orm fail:FATAL It is forbidden to run loop on threads other than event-loop thread - EventLoop.cc:217 #1266

Closed klc407073648 closed 2 years ago

klc407073648 commented 2 years ago

使用方法: controller里面使用Mapper userMapper = Mapper(app().getFastDbClient()); config.json里面"is_fast": true 然后使用对于userMapper 调用方法就会报错: 20220529 02:50:15.964212 UTC 21087 FATAL It is forbidden to run loop on threads other than event-loop thread - EventLoop.cc:217

临时修改策略: controller里面使用Mapper userMapper = Mapper(app().getDbClient()); config.json里面"is_fast": false

看一下能否解决?还是说配置文件还有哪里又问题?

hwc0919 commented 2 years ago

Fast DbClient 只能在自己所在的 IO 线程调用,请检查如下几点:

  1. 每次使用时都重新调用 getFastDbClient(), 不要使用static变量或类成员变量等存储
  2. 获取client时处于IO线程内,使用该client时处于同一线程。
  3. controller内的代码可能并不全部都运行在IO线程。任何非fast的回调函数或者 coroutine 调用都可能导致线程切换。
  4. 不要在 filter 内使用非fast的回调函数或coroutine