Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ public JsonWorld(final Integer id, final Integer randomNumber) {
PgClients clients;


public Uni<JsonWorld> findAsJsonWorld(final Integer id) {
public Uni<JsonWorld> findAsJsonWorld(final Tuple id) {
return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1")
.execute(Tuple.of(id))
.execute(id)
.map(rowset -> {
final Row row = rowset.iterator().next();
return new JsonWorld(row.getInteger(0), row.getInteger(1));
});
}

public Uni<World> find(final Integer id) {
public Uni<World> find(final Tuple id) {
return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1")
.execute(Tuple.of(id))
.execute(id)
.map(rowset -> {
final Row row = rowset.iterator().next();
return new World(row.getInteger(0), row.getInteger(1));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.smallrye.mutiny.Uni;
import io.vertx.core.json.JsonArray;
import io.vertx.ext.web.RoutingContext;
import io.vertx.mutiny.sqlclient.Tuple;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

Expand All @@ -24,7 +25,7 @@ public class DbResource extends BaseResource {

@Route(path = "db")
public void db(final RoutingContext rc) {
worldRepository.findAsJsonWorld(boxedRandomWorldNumber())
worldRepository.findAsJsonWorld(getRandomTuple())
.subscribe().with(world -> sendJson(rc, world),
t -> handleFail(rc, t));
}
Expand All @@ -36,7 +37,7 @@ public void queries(final RoutingContext rc) {
final var ret = new JsonWorld[worlds.length];
// replace below with a for loop
Arrays.setAll(worlds, i -> {
return worldRepository.findAsJsonWorld(boxedRandomWorldNumber()).map(w -> ret[i] = w);
return worldRepository.findAsJsonWorld(getRandomTuple()).map(w -> ret[i] = w);
});

Uni.combine().all().unis(worlds)
Expand Down Expand Up @@ -75,10 +76,18 @@ public void updates(final RoutingContext rc) {
}

private Uni<World> randomWorld() {
return worldRepository.find(boxedRandomWorldNumber());
return worldRepository.find(getRandomTuple());
}

private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new);
private static final Tuple[] tupleCache = new Tuple[10000];

static {
for (int i = 0; i < 10000; i++) {
tupleCache[i] = Tuple.of(i + 1);
}
}


private static Integer boxedRandomWorldNumber() {
final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001);
Expand All @@ -87,6 +96,17 @@ private static Integer boxedRandomWorldNumber() {
return boxedRnd;
}

private static int primitiveRandomWorldNumber() {
final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001);
return rndValue;
}

private static Tuple getRandomTuple() {
final int rndValue = primitiveRandomWorldNumber();
final Tuple tuple = tupleCache[rndValue - 1];
return tuple;
}

private static int parseQueryCount(final String textValue) {
if (textValue == null) {
return 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ public class WorldRepository {
private PgConnectionPool connectionPool;

private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new);
private static final Tuple[] tupleCache = new Tuple[10000];

static {
for (int i = 0; i < 10000; i++) {
tupleCache[i] = Tuple.of(i + 1);
}
}


private static Integer boxedRandomWorldNumber() {
final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001);
Expand All @@ -36,8 +44,20 @@ private static Integer boxedRandomWorldNumber() {
return boxedRnd;
}

private static int primitiveRandomWorldNumber() {
final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001);
return rndValue;
}

private static Tuple getRandomTuple() {
final int rndValue = primitiveRandomWorldNumber();
final Tuple tuple = tupleCache[rndValue - 1];
return tuple;
}


public void loadRandomJsonWorld(final Handler<AsyncResult<JsonWorld>> worldHandler) {
connectionPool.pgConnection().selectWorldQuery().execute(Tuple.of(boxedRandomWorldNumber()), randomWorldRow -> {
connectionPool.pgConnection().selectWorldQuery().execute(getRandomTuple(), randomWorldRow -> {
if (randomWorldRow.succeeded()) {
final RowIterator<Row> resultSet = randomWorldRow.result().iterator();
if (!resultSet.hasNext()) {
Expand Down Expand Up @@ -101,16 +121,15 @@ private void run() {
connection.rawConnection().group(c -> {
final PreparedQuery<RowSet<Row>> preparedQuery = c.preparedQuery(PgConnectionPool.SELECT_WORLD);
for (int i = 0; i < worldsToUpdate.length; i++) {
final Integer id = boxedRandomWorldNumber();
final int index = i;
preparedQuery.execute(Tuple.of(id), worldId -> {
preparedQuery.execute(getRandomTuple(), worldId -> {
if (!failed) {
if (worldId.failed()) {
failed = true;
resultHandler.handle(Future.failedFuture(worldId.cause()));
return;
}
worldsToUpdate[index] = new World(worldId.result().iterator().next().getInteger(0), boxedRandomWorldNumber());
worldsToUpdate[index] = new World(worldId.result().iterator().next().getInteger(0), primitiveRandomWorldNumber());
if (++selectWorldCompletedCount == worldsToUpdate.length) {
randomWorldsQueryCompleted();
}
Expand Down Expand Up @@ -159,7 +178,7 @@ public static void execute(final PgConnectionPool connectionPool, final int quer
private void run() {
connection.rawConnection().group(c -> {
for (int i = 0; i < count; i++) {
c.preparedQuery(PgConnectionPool.SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this);
c.preparedQuery(PgConnectionPool.SELECT_WORLD).execute(getRandomTuple(), this);
}
});
}
Expand Down
25 changes: 20 additions & 5 deletions frameworks/Java/vertx/src/main/java/vertx/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ static int getQueries(HttpServerRequest request) {
private static final String SELECT_FORTUNE = "SELECT id, message FROM fortune";
private static final String SELECT_WORLDS = "SELECT id, randomnumber FROM world";

private static final Tuple[] tupleCache = new Tuple[10000];

public static CharSequence createDateHeader() {
return HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
}
Expand All @@ -109,6 +111,17 @@ static Integer boxedRandomWorldNumber() {
return boxedRnd;
}

static int primitiveRandomWorldNumber() {
final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001);
return rndValue;
}

static Tuple getRandomTuple() {
final int rndValue = primitiveRandomWorldNumber();
final Tuple tuple = tupleCache[rndValue - 1];
return tuple;
}

private HttpServer server;
private SqlClientInternal client;
private CharSequence dateString;
Expand Down Expand Up @@ -159,6 +172,9 @@ public Future<?> start() throws Exception {
plaintextHeaders = plaintextHeaders();
jsonHeaders = jsonHeaders();
});
for (int i = 0; i < 10000; i++) {
tupleCache[i] = Tuple.of(i + 1);
}
PgConnectOptions options = new PgConnectOptions();
options.setDatabase(config.getString("database", "hello_world"));
options.setHost(config.getString("host", "tfb-database"));
Expand Down Expand Up @@ -292,7 +308,7 @@ private void handleJson(HttpServerRequest request) {

private void handleDb(HttpServerRequest req) {
HttpServerResponse resp = req.response();
SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber())).onComplete(res -> {
SELECT_WORLD_QUERY.execute(getRandomTuple()).onComplete(res -> {
if (res.succeeded()) {
RowIterator<Row> resultSet = res.result().iterator();
if (!resultSet.hasNext()) {
Expand Down Expand Up @@ -335,7 +351,7 @@ private void handle() {
client.group(/*queries, */c -> {
for (int i = 0; i < queries; i++) {
c.preparedQuery(SELECT_WORLD)
.execute(Tuple.of(boxedRandomWorldNumber()))
.execute(getRandomTuple())
.onComplete(this);
}
});
Expand Down Expand Up @@ -382,16 +398,15 @@ public void handle() {
client.group(/*worldsToUpdate.length, */c -> {
final PreparedQuery<RowSet<Row>> preparedQuery = c.preparedQuery(App.SELECT_WORLD);
for (int i = 0; i < worldsToUpdate.length; i++) {
final Integer id = boxedRandomWorldNumber();
final int index = i;
preparedQuery.execute(Tuple.of(id)).onComplete(res -> {
preparedQuery.execute(getRandomTuple()).onComplete(res -> {
if (!failed) {
if (res.failed()) {
failed = true;
sendError(request, res.cause());
return;
}
worldsToUpdate[index] = new World(res.result().iterator().next().getInteger(0), boxedRandomWorldNumber());
worldsToUpdate[index] = new World(res.result().iterator().next().getInteger(0), primitiveRandomWorldNumber());
if (++selectWorldCompletedCount == worldsToUpdate.length) {
randomWorldsQueryCompleted();
}
Expand Down