Kotlin协程和“挂起函数”使程序员在不停止线程的情况下很容易等待输入/输出的结果(在输入/输出完成之前,线程还有其他工作要做)。
jOOQ是一个Java的产品,用于以类型安全的方式编写和执行SQL,但它本身并不明确使用静态编程语言协程。
可以从静态编程语言协例程范围调用jOOQ以获得易于编写和线程高效甚至在IO期间的好处吗?
suspend fun myQuery() {
return dsl.select()
// .etc()
.fetch() // <- could this be a 'suspend' call?
}
JOOQ添加了R2dbc支持,ResultQuery是一个反应流发布器。
目前最简单的方法是使用Reactor-Kotlin扩展将Reactor-api转换为Kotlin协程api。
Flux.from(
ctx.select()
...//etc
...// do not call fetch
)
.asFlow()
更新:Jooq家伙取消了DslContext上Kotlin协程的PR,因此现在您必须如上所述使用kotlinx协程ractor。
切换到3.17或更高版本时,直接使用fetchAwait。添加了一系列xxxAwait
ctx.select()
...//etc
.fetchAwait()
A:是的。
org.jooq.结果查询
ANDkotlinx-coroutines-jdk8
提供了一系列扩展方法,用于在静态编程语言暂停函数和JDK 8期货之间进行适配。
因此,我们可以做到:
import kotlinx.coroutines.future.await
...
suspend fun myQuery() {
return dsl.select()
//.etc()
.fetchAsync()
.await() // <- IS a suspending call !!!
}
应该注意的是,在ResultQuery上有许多重载的fetchX()方法,它们为同步调用提供了很多实用工具,但它们对于fetchAsync()没有类似的重载。这就是Kotlin程序员可能希望熟悉Java未来机制的地方:任何类型的操作都可以在完成阶段使用
然后应用{}
方法异步完成
suspend fun myQuery() {
return dsl.select()
//.etc()
.fetchAsync()
.thenApply { it.map(mapping(::Film)) } // <- done as part of the 'suspend'
.await()
}
尽管在暂停后这样做是可以的:
suspend fun myQuery() {
val records = dsl.select()
//.etc()
.fetchAsync()
.await()
return records.map(mapping(::Film))
}
我想在java中使用集合而不是数组来序列化postgreSQL数组。例如INT[]、varchar(256)[]到java集合和Collection。 SQL: 创建表array_tests(string_array varchar(256)[]); 我在生成的类中出错:
作为再现这个概念的一个非常基本的示例,我有这样一个类: 当我在这里嘲笑它的时候: 我再次得到IllegalStateException错误。 有人有想法吗?
Android官方文档指出,不建议使用,因为它可能会长时间锁定UI并触发ANR。但是Kotlin协同程序使我们能够在主线程中执行一些操作,而不会有效地阻塞UI。 所以我要问:使用并在主线程上运行的Couroutine作用域中访问数据库是否安全?如下所示: 或者我们应该坚持不允许主线程查询和在另一个线程中执行数据库查询的旧方法? 我这样问是因为前一种方式(使用): 更具可读性(我可以在访问数据库的函
本文向大家介绍Kotlin 你好,世界,包括了Kotlin 你好,世界的使用技巧和注意事项,需要的朋友参考一下 示例 所有Kotlin程序都从该main功能开始。这是一个简单的Kotlin“ Hello World”程序的示例: 将上面的代码放入一个名为的文件中Main.kt(此文件名完全是任意的) 以JVM为目标时,该函数将作为类的静态方法编译为具有从文件名派生的名称的类。在上面的示例中,要运行
问题内容: MyBatis提供了映射,本地缓存和开箱即用的功能。 QueryDSL / jOOQ提供了SQL语句的编译时检查和IDE自动完成的结果。 是否可以将它们组合在一起? 换句话说, 我想使用QueryDSL或jOOQ创建一个查询,然后使用MyBatis用一些粘合代码/适配器执行它 。 我已经检查过的内容: 我考虑过使用QueryDSL生成SQL查询字符串,并在MyBatis中使用它的’@S
我在这种情况下有点麻烦 问题是,如果"b"为空,运行块将被执行,即使elvis操作符引用了"a"let。我已经试过用"应用"代替"运行",同样的事情发生了