Browse Source

use reactive-pg kotlin integration (#4283)

Walton Hoops 6 years ago
parent
commit
73f66a5a96

+ 2 - 4
frameworks/Kotlin/ktor/ktor-asyncdb/build.gradle

@@ -23,10 +23,8 @@ dependencies {
     compile "io.ktor:ktor-server-netty:$ktor_version"
     compile "io.ktor:ktor-server-netty:$ktor_version"
     compile "io.ktor:ktor-html-builder:$ktor_version"
     compile "io.ktor:ktor-html-builder:$ktor_version"
     compile "com.github.jasync-sql:jasync-postgresql:0.8.54"
     compile "com.github.jasync-sql:jasync-postgresql:0.8.54"
-    compile "io.reactiverse:reactive-pg-client:0.11.0"
-    compile "io.reactivex.rxjava2:rxjava:2.2.4"
-    compile 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.0.1'
-    compile 'io.vertx:vertx-rx-java2:3.6.0'
+    compile "io.reactiverse:reactive-pg-client:0.11.1"
+    compile 'io.vertx:vertx-lang-kotlin-coroutines:3.6.2'
 }
 }
 
 
 compileKotlin {
 compileKotlin {

+ 13 - 24
frameworks/Kotlin/ktor/ktor-asyncdb/src/main/kotlin/main.kt

@@ -15,12 +15,10 @@ import io.ktor.routing.get
 import io.ktor.routing.routing
 import io.ktor.routing.routing
 import io.ktor.server.engine.embeddedServer
 import io.ktor.server.engine.embeddedServer
 import io.ktor.server.netty.Netty
 import io.ktor.server.netty.Netty
-import io.reactiverse.pgclient.PgPoolOptions
-import io.reactiverse.reactivex.pgclient.PgClient
-import io.reactiverse.reactivex.pgclient.PgRowSet
-import io.reactiverse.reactivex.pgclient.Row
-import io.reactiverse.reactivex.pgclient.Tuple
-import kotlinx.coroutines.rx2.await
+import io.reactiverse.kotlin.pgclient.getConnectionAwait
+import io.reactiverse.kotlin.pgclient.preparedBatchAwait
+import io.reactiverse.kotlin.pgclient.preparedQueryAwait
+import io.reactiverse.pgclient.*
 import kotlinx.html.*
 import kotlinx.html.*
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.json.JSON
 import kotlinx.serialization.json.JSON
@@ -82,20 +80,11 @@ class JasyncRepository() : Repository {
     }
     }
 }
 }
 
 
-fun PgRowSet.rows(): List<Row> {
-    val rows = mutableListOf<Row>()
-    val iterator = iterator()
-    while (iterator.hasNext()) {
-        rows.add(iterator.next())
-    }
-    return rows
-}
-
 class ReactivePGRepository : Repository {
 class ReactivePGRepository : Repository {
-    private val poolOptions = PgPoolOptions()
-    private val db: PgClient
+    private val db: PgPool
 
 
     init {
     init {
+        val poolOptions = PgPoolOptions()
         poolOptions.apply {
         poolOptions.apply {
             host = "tfb-database"
             host = "tfb-database"
             database = "hello_world"
             database = "hello_world"
@@ -108,20 +97,20 @@ class ReactivePGRepository : Repository {
     }
     }
 
 
     override suspend fun getFortunes(): List<Fortune> {
     override suspend fun getFortunes(): List<Fortune> {
-        val results = db.rxPreparedQuery("select id, message from fortune").await()
-        return results.rows().map { Fortune(it.getInteger(0), it.getString(1)) }
+        val results = db.preparedQueryAwait("select id, message from fortune")
+        return results.map { Fortune(it.getInteger(0), it.getString(1)) }
     }
     }
 
 
     override suspend fun getWorld(): World {
     override suspend fun getWorld(): World {
         val worldId = rand.nextInt(1, 10000)
         val worldId = rand.nextInt(1, 10000)
-        val result = db.rxPreparedQuery("select id, randomNumber from world where id = $1", Tuple.of(worldId)).await()
-        val row = result.rows().first()
+        val result = db.preparedQueryAwait("select id, randomNumber from world where id = $1", Tuple.of(worldId))
+        val row = result.first()
         return World(row.getInteger(0), row.getInteger(1)!!)
         return World(row.getInteger(0), row.getInteger(1)!!)
     }
     }
 
 
     override suspend fun updateWorlds(worlds: List<World>) {
     override suspend fun updateWorlds(worlds: List<World>) {
         val batch = worlds.map { Tuple.of(it.id, it.randomNumber) }
         val batch = worlds.map { Tuple.of(it.id, it.randomNumber) }
-        db.rxPreparedBatch("update world set randomNumber = $1 where id = $2", batch).await()
+        db.preparedBatchAwait("update world set randomNumber = $1 where id = $2", batch)
     }
     }
 }
 }
 
 
@@ -165,7 +154,7 @@ class FortuneTemplate(val fortunes: List<Fortune>, val main: MainTemplate = Main
 }
 }
 
 
 fun main(args: Array<String>) {
 fun main(args: Array<String>) {
-    val db = when(args.first()) {
+    val db = when(args.firstOrNull()) {
         "jasync-sql" -> JasyncRepository()
         "jasync-sql" -> JasyncRepository()
         "reactive-pg" -> ReactivePGRepository()
         "reactive-pg" -> ReactivePGRepository()
         else -> throw IllegalArgumentException("Must specify a postgres client")
         else -> throw IllegalArgumentException("Must specify a postgres client")
@@ -221,4 +210,4 @@ fun main(args: Array<String>) {
     }
     }
 
 
     server.start(wait = true)
     server.start(wait = true)
-}
+}

+ 1 - 1
frameworks/Kotlin/ktor/ktor-jasync.dockerfile

@@ -7,4 +7,4 @@ COPY ktor-asyncdb/gradlew gradlew
 COPY ktor-asyncdb/settings.gradle settings.gradle
 COPY ktor-asyncdb/settings.gradle settings.gradle
 COPY ktor-asyncdb/src src
 COPY ktor-asyncdb/src src
 RUN /app/gradlew --no-daemon shadowJar
 RUN /app/gradlew --no-daemon shadowJar
-CMD ["java", "-server", "-jar", "/app/build/libs/bench.jar", "jasync-sql"]
+CMD ["java", "-server", "-XX:+UseParallelGC", "-Xms2G","-Xmx2G", "-jar", "/app/build/libs/bench.jar", "jasync-sql"]

+ 1 - 1
frameworks/Kotlin/ktor/ktor-reactivepg.dockerfile

@@ -7,4 +7,4 @@ COPY ktor-asyncdb/gradlew gradlew
 COPY ktor-asyncdb/settings.gradle settings.gradle
 COPY ktor-asyncdb/settings.gradle settings.gradle
 COPY ktor-asyncdb/src src
 COPY ktor-asyncdb/src src
 RUN /app/gradlew --no-daemon shadowJar
 RUN /app/gradlew --no-daemon shadowJar
-CMD ["java", "-server", "-jar", "/app/build/libs/bench.jar", "reactive-pg"]
+CMD ["java", "-server", "-XX:+UseParallelGC", "-Xms2G","-Xmx2G", "-jar", "/app/build/libs/bench.jar", "reactive-pg"]