7

我正在使用 Ktor 和 Exposed ORM 编写服务,这显然不是异步的。我来自 Python 世界,然后回到那里使用带有异步 IO 库的阻塞 ORM 是一种罪过,因为它可能会阻塞线程中的所有用户。同样的规则是否适用于 Kotlin?我在创建一个糟糕的架构吗?

4

3 回答 3

6

Exposed 使用线程本地存储来保持事务实例可供实现访问,并避免将其与每个函数调用一起传递。由于transactionDSL 函数是同步执行的,并且不会释放线程以供 ktor 重用于其他调用,因此一起使用它们应该没有任何问题。

于 2017-08-19T15:01:05.247 回答
2

Exposed 中有协程支持。

请阅读文档:

https://github.com/JetBrains/Exposed/wiki/Transactions#working-with-coroutines

于 2020-02-14T09:45:12.527 回答
1

这是一篇博文,展示了如何一起使用它们:

https://ryanharrison.co.uk/2018/04/14/kotlin-ktor-exposed-starter.html

我自己也在一个测试项目中成功地做到了这一点,但我还没有准备好分享代码。

简而言之,您可以使用 Kotlin 协程在线程上执行数据库事务,这样它们就不会阻塞 KTOR 的请求处理循环。如果使用正确的协程调度程序,那么这不会给线程本地事务上下文带来任何问题。

于 2018-11-11T11:38:30.737 回答