|
@@ -1,6 +1,4 @@
|
|
|
import io.vertx.core.Future
|
|
|
-import io.vertx.core.Vertx
|
|
|
-import io.vertx.core.VertxOptions
|
|
|
import io.vertx.pgclient.PgConnectOptions
|
|
|
import io.vertx.pgclient.PgPool.client
|
|
|
import io.vertx.sqlclient.PoolOptions
|
|
@@ -11,13 +9,7 @@ import java.util.Random
|
|
|
|
|
|
|
|
|
class PostgresDatabase : Database {
|
|
|
- private val queryPool: SqlClient
|
|
|
- private val updatePool: SqlClient
|
|
|
-
|
|
|
- private val random = Random()
|
|
|
-
|
|
|
- init {
|
|
|
- val vertx = Vertx.vertx(VertxOptions().setPreferNativeTransport(true))
|
|
|
+ private val dbPool = run {
|
|
|
val connectOptions = PgConnectOptions().apply {
|
|
|
port = 5432
|
|
|
cachePreparedStatements = true
|
|
@@ -26,52 +18,53 @@ class PostgresDatabase : Database {
|
|
|
user = "benchmarkdbuser"
|
|
|
password = "benchmarkdbpass"
|
|
|
}
|
|
|
- val clientOptions = PoolOptions().setMaxSize(64)
|
|
|
- queryPool = client(vertx, connectOptions, clientOptions)
|
|
|
- updatePool = client(vertx, connectOptions, clientOptions)
|
|
|
+ client(connectOptions, PoolOptions().apply { maxSize = 64 })
|
|
|
}
|
|
|
|
|
|
- override fun findWorld() =
|
|
|
- queryPool.findWorld(random.world()).toCompletionStage().toCompletableFuture().get()
|
|
|
+ private val random = Random()
|
|
|
+
|
|
|
+ override fun findWorld() = dbPool.findWorld(random.world())
|
|
|
|
|
|
- override fun loadAll() = queryPool.preparedQuery("SELECT id, randomnumber FROM world ")
|
|
|
+ override fun loadAll() = dbPool.preparedQuery("SELECT id, randomnumber FROM world")
|
|
|
.execute()
|
|
|
.map { it.map(::toWorld) }
|
|
|
- .toCompletionStage().toCompletableFuture().get()
|
|
|
+ .awaitComplete()
|
|
|
|
|
|
- override fun findWorlds(count: Int) =
|
|
|
- Future
|
|
|
- .all(
|
|
|
- (1..count).map { queryPool.findWorld(random.world()) }
|
|
|
- ).toCompletionStage().toCompletableFuture().get().list<World>()
|
|
|
+ override fun findWorlds(count: Int) = (1..count)
|
|
|
+ .map { dbPool.findWorld(random.world()) }
|
|
|
|
|
|
- override fun updateWorlds(count: Int) = (1..count).map {
|
|
|
- queryPool.findWorld(random.world())
|
|
|
- .flatMap { world ->
|
|
|
- updatePool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2")
|
|
|
- .execute(Tuple.of(random.world(), world.first))
|
|
|
- .map { world }
|
|
|
+ override fun updateWorlds(count: Int) = (1..count)
|
|
|
+ .map { World(random.world(), random.world()) }
|
|
|
+ .onEach {
|
|
|
+ dbPool
|
|
|
+ .preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1")
|
|
|
+ .execute(Tuple.of(it.first))
|
|
|
+ .map { rowSet ->
|
|
|
+ val row = rowSet.iterator().next()
|
|
|
+ row.getInteger(1)
|
|
|
+ dbPool
|
|
|
+ .preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2")
|
|
|
+ .execute(Tuple.of(it.second, it.first))
|
|
|
}
|
|
|
- .toCompletionStage()
|
|
|
- .toCompletableFuture()
|
|
|
- .get()
|
|
|
+ .awaitComplete()
|
|
|
}
|
|
|
|
|
|
- override fun fortunes() = queryPool.preparedQuery("SELECT id, message FROM fortune")
|
|
|
+ override fun fortunes() = dbPool.preparedQuery("SELECT id, message FROM fortune")
|
|
|
.execute()
|
|
|
- .map { it.map(::toFortune) }
|
|
|
+ .map { it.map { Fortune(it.getInteger(0), it.getString(1)) } }
|
|
|
.map { (it + Fortune(0, "Additional fortune added at request time.")) }
|
|
|
.map { it.sortedBy { it.message } }
|
|
|
- .toCompletionStage().toCompletableFuture().get()
|
|
|
+ .awaitComplete()
|
|
|
|
|
|
companion object {
|
|
|
private fun SqlClient.findWorld(id: Int) =
|
|
|
preparedQuery("SELECT id, randomnumber FROM world WHERE id = $1")
|
|
|
.execute(Tuple.of(id))
|
|
|
- .map { toWorld(it.single()) }
|
|
|
+ .map { it.map(::toWorld).first() }
|
|
|
+ .awaitComplete()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private fun toWorld(r: Row) = r.getInteger("id") to r.getInteger("randomnumber")
|
|
|
|
|
|
-private fun toFortune(it: Row) = Fortune(it.getInteger(0), it.getString(1))
|
|
|
+private fun <T> Future<T>.awaitComplete(): T = toCompletionStage().toCompletableFuture().get()
|