我可以将 Ktor 与 Exposed 混合使用吗?
Can I mix Ktor with Exposed?
我正在使用 Ktor 和 Exposed ORM 编写一个显然不是异步的服务。我来自 Python 世界,回到那里使用带有异步 IO 库的阻塞 ORM 是一种罪过,因为它可能会阻塞线程中的所有用户。
同样的规则是否适用于 Kotlin?我创建的架构不好吗?
Exposed 使用线程本地存储来保持事务实例可访问,并避免将其与每个函数调用一起传递。由于 transaction
DSL 函数是同步执行的,并且不会释放线程以供 ktor 重新用于其他调用,因此将它们一起使用应该没有任何问题。
这是一篇展示如何一起使用它们的博文:
https://ryanharrison.co.uk/2018/04/14/kotlin-ktor-exposed-starter.html
我自己也在一个测试项目中成功地做到了这一点,但我还没有准备好分享代码。
简而言之,您可以使用 Kotlin 协程,在线程上执行数据库事务,这样它们就不会阻塞 KTOR 的请求处理循环。
如果使用正确的协程调度程序,那么这应该不会给线程本地事务上下文带来任何问题。
Exposed 支持协程。
请阅读文档:
https://github.com/JetBrains/Exposed/wiki/Transactions#working-with-coroutines
我正在使用 Ktor 和 Exposed ORM 编写一个显然不是异步的服务。我来自 Python 世界,回到那里使用带有异步 IO 库的阻塞 ORM 是一种罪过,因为它可能会阻塞线程中的所有用户。 同样的规则是否适用于 Kotlin?我创建的架构不好吗?
Exposed 使用线程本地存储来保持事务实例可访问,并避免将其与每个函数调用一起传递。由于 transaction
DSL 函数是同步执行的,并且不会释放线程以供 ktor 重新用于其他调用,因此将它们一起使用应该没有任何问题。
这是一篇展示如何一起使用它们的博文:
https://ryanharrison.co.uk/2018/04/14/kotlin-ktor-exposed-starter.html
我自己也在一个测试项目中成功地做到了这一点,但我还没有准备好分享代码。
简而言之,您可以使用 Kotlin 协程,在线程上执行数据库事务,这样它们就不会阻塞 KTOR 的请求处理循环。 如果使用正确的协程调度程序,那么这应该不会给线程本地事务上下文带来任何问题。
Exposed 支持协程。
请阅读文档:
https://github.com/JetBrains/Exposed/wiki/Transactions#working-with-coroutines