我在我的API后端使用Kotlin。我不想在common pool
中运行数据库查询。基本上,我想创建一个CoroutineContext
,它有许多与数据库maximumPoolSize
匹配的线程。
实现这一目标的最佳方法是什么(通常和我的具体用例)?我知道Kotlin提供contexts
开箱即用,但是创建自己的最佳方法是什么?
奖金问题:如果我的jdbc连接池大小为3,那么使用线程池大小为3的coroutinecontext是否有意义?这可以保证最好的并发性吗?
答案 0 :(得分:4)
您可以使用newFixedThreadPoolContext
创建一个由具有固定线程数的线程池支持的CoroutineContext
:
val myContext = newFixedThreadPoolContext(nThreads = 3, name = "My JDBC context")
是的,将线程池的大小与连接池的大小相匹配似乎是一个好主意,因为这样你的线程(假设它们每次都使用一个连接)将始终为它们准备好数据库连接 - here's一篇博客文章提出了同样的建议。
答案 1 :(得分:0)
函数newFixedThreadPoolContext
在当前版本的Kotlin协程(1.3.0)中被认为已过时,因为它现在已用@ObsoleteCoroutinesApi
进行了注释,如果您尝试使用该函数,它将发出警告。 。该文档还指出,将来会替换它。
创建CoroutineContext的推荐方法现在是通过
Executors.newFixedThreadPool(3).asCoroutineDispatcher()
因此,带有导入的完整示例(其中还会创建一个CoroutineScope)看起来像这样
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import java.util.concurrent.Executors
import kotlin.coroutines.CoroutineContext
fun coroutineScope(threads: Int): CoroutineScope {
val context: CoroutineContext = Executors.newFixedThreadPool(threads).asCoroutineDispatcher()
return CoroutineScope(context)
}