Browse Source

Update queries/updates to remove future and clean up (#2896)

* optimize plaintext and router

* optimize multiple queries and updates

* upgrade to light-java 1.2.5

* optimize json handler to use java object instead of map

* optimized for round 15

* upgrade postgres driver and connection pool

* clean up some of the default middleware handlers and startup hooks as they are not used in the tests

* update queries and updates to remove future
Steve Hu 8 years ago
parent
commit
418f31b952

+ 0 - 5
frameworks/Java/light-java/pom.xml

@@ -52,11 +52,6 @@
             <artifactId>utility</artifactId>
             <version>${version.light-java}</version>
         </dependency>
-        <dependency>
-            <groupId>com.networknt</groupId>
-            <artifactId>security</artifactId>
-            <version>${version.light-java}</version>
-        </dependency>
         <dependency>
             <groupId>com.networknt</groupId>
             <artifactId>status</artifactId>

+ 0 - 70
frameworks/Java/light-java/src/main/java/com/networknt/techempower/Helper.java

@@ -56,74 +56,4 @@ public final class Helper {
         return 1 + ThreadLocalRandom.current().nextInt(10000);
     }
 
-    private static final int cpuCount = Runtime.getRuntime().availableProcessors();
-
-    public static final Executor executor =
-            Executors.newFixedThreadPool(2000,
-                    new ThreadFactory() {
-                        @Override
-                        public Thread newThread(Runnable r) {
-                            Thread t = new Thread(r);
-                            t.setDaemon(true);
-                            return t;
-                        }
-                    });
-
-    public static World selectWorld(DataSource ds) {
-        try (final Connection connection = ds.getConnection()) {
-            try (PreparedStatement statement = connection.prepareStatement(
-                    "SELECT * FROM world WHERE id = ?",
-                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
-                statement.setInt(1, Helper.randomWorld());
-                try (ResultSet resultSet = statement.executeQuery()) {
-                    resultSet.next();
-                    return new World(
-                            resultSet.getInt("id"),
-                            resultSet.getInt("randomNumber"));
-                }
-            }
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    public static World updateWorld(DataSource ds) {
-        World world;
-        try (final Connection connection = ds.getConnection()) {
-            try (PreparedStatement update = connection.prepareStatement(
-                    "UPDATE world SET randomNumber = ? WHERE id= ?")) {
-                try (PreparedStatement query = connection.prepareStatement(
-                        "SELECT * FROM world WHERE id = ?",
-                        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
-
-                    query.setInt(1, Helper.randomWorld());
-                    try (ResultSet resultSet = query.executeQuery()) {
-                        resultSet.next();
-                        world = new World(
-                                resultSet.getInt("id"),
-                                resultSet.getInt("randomNumber"));
-                    }
-                }
-                world.randomNumber = Helper.randomWorld();
-                update.setInt(1, world.randomNumber);
-                update.setInt(2, world.id);
-                update.executeUpdate();
-                return world;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    public static <T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> futures) {
-        CompletableFuture<Void> allDoneFuture =
-                CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
-        return allDoneFuture.thenApply(v ->
-                futures.stream().
-                        map(future -> future.join()).
-                        collect(Collectors.<T>toList())
-        );
-    }
-
 }

+ 5 - 8
frameworks/Java/light-java/src/main/java/com/networknt/techempower/PathHandlerProvider.java

@@ -5,6 +5,7 @@ import com.networknt.server.HandlerProvider;
 import io.undertow.Handlers;
 import io.undertow.server.HttpHandler;
 import io.undertow.server.HttpServerExchange;
+import io.undertow.server.handlers.BlockingHandler;
 import io.undertow.util.Methods;
 import com.networknt.techempower.handler.*;
 
@@ -12,16 +13,12 @@ public class PathHandlerProvider implements HandlerProvider {
     @Override
     public HttpHandler getHandler() {
         return Handlers.path()
-            //.addExactPath("/db/mysql", new DbMysqlGetHandler())
             .addExactPath("/plaintext", new PlaintextGetHandler())
             .addExactPath("/json", new JsonGetHandler())
-            .addExactPath("/db", new DbPostgresqlGetHandler())
-            //.addExactPath("/fortunes/mysql", new FortunesMysqlGetHandler())
-            .addExactPath("/fortunes", new FortunesPostgresqlGetHandler())
-            //.addExactPath("/queries/mysql", new QueriesMysqlGetHandler())
-            .addExactPath("/queries", new QueriesPostgresqlGetHandler())
-            //.addExactPath("/updates/mysql", new UpdatesMysqlGetHandler())
-            .addExactPath("/updates", new UpdatesPostgresqlGetHandler())
+            .addExactPath("/db", new BlockingHandler(new DbPostgresqlGetHandler()))
+            .addExactPath("/fortunes", new BlockingHandler(new FortunesPostgresqlGetHandler()))
+            .addExactPath("/queries", new BlockingHandler(new QueriesPostgresqlGetHandler()))
+            .addExactPath("/updates", new BlockingHandler(new UpdatesPostgresqlGetHandler()))
         ;
     }
 }

+ 0 - 57
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbMysqlGetHandler.java

@@ -1,57 +0,0 @@
-package com.networknt.techempower.handler;
-
-import com.dslplatform.json.DslJson;
-import com.dslplatform.json.JsonWriter;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.networknt.config.Config;
-import com.networknt.techempower.Helper;
-import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
-import com.networknt.techempower.model.World;
-import io.undertow.server.HttpHandler;
-import io.undertow.server.HttpServerExchange;
-import io.undertow.util.Headers;
-import io.undertow.util.HttpString;
-
-import java.nio.ByteBuffer;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-
-import javax.sql.DataSource;
-
-public class DbMysqlGetHandler implements HttpHandler {
-    private final DataSource ds = MysqlStartupHookProvider.ds;
-    private DslJson<Object> dsl = new DslJson<>();
-    private JsonWriter writer = dsl.newWriter(512);
-
-    @Override
-    public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-       exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
-        World world;
-        try (final Connection connection = ds.getConnection()) {
-            try (PreparedStatement statement = connection.prepareStatement(
-                    "SELECT * FROM world WHERE id = ?",
-                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
-                statement.setInt(1, Helper.randomWorld());
-                try(ResultSet resultSet = statement.executeQuery()) {
-                    resultSet.next();
-                    world = new World(resultSet.getInt("id"), resultSet.getInt("randomNumber"));
-                }
-            }
-        }
-        writer.reset();
-        world.serialize(writer, true);
-        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
-    }
-}

+ 0 - 5
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbPostgresqlGetHandler.java

@@ -30,11 +30,6 @@ public class DbPostgresqlGetHandler implements HttpHandler {
 
     @Override
     public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-        // 24682 59
         World world;
         exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
         try (final Connection connection = ds.getConnection()) {

+ 0 - 55
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesMysqlGetHandler.java

@@ -1,55 +0,0 @@
-package com.networknt.techempower.handler;
-
-import com.github.mustachejava.DefaultMustacheFactory;
-import com.github.mustachejava.Mustache;
-import com.github.mustachejava.MustacheFactory;
-import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
-import com.networknt.techempower.model.Fortune;
-import io.undertow.server.HttpHandler;
-import io.undertow.server.HttpServerExchange;
-import io.undertow.util.Headers;
-import io.undertow.util.HttpString;
-
-import java.io.StringWriter;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.*;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-
-import javax.sql.DataSource;
-
-public class FortunesMysqlGetHandler implements HttpHandler {
-    private final MustacheFactory mustacheFactory = new DefaultMustacheFactory();
-    private final DataSource ds = MysqlStartupHookProvider.ds;
-
-    @Override
-    public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-        List<Fortune> fortunes = new ArrayList<>();
-        try (Connection connection = ds.getConnection();
-             PreparedStatement statement = connection.prepareStatement(
-                     "SELECT * FROM fortune",
-                     ResultSet.TYPE_FORWARD_ONLY,
-                     ResultSet.CONCUR_READ_ONLY);
-             ResultSet resultSet = statement.executeQuery()) {
-                while (resultSet.next()) {
-                fortunes.add(new Fortune(
-                        resultSet.getInt("id"),
-                        resultSet.getString("message")));
-            }
-        }
-        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-        Collections.sort(fortunes);
-        Mustache mustache = mustacheFactory.compile("fortunes.mustache");
-        StringWriter writer = new StringWriter();
-        mustache.execute(writer, fortunes);
-        exchange.getResponseHeaders().put(
-                Headers.CONTENT_TYPE, "text/html");
-        exchange.getResponseSender().send(writer.toString());
-    }
-}

+ 0 - 4
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesPostgresqlGetHandler.java

@@ -23,10 +23,6 @@ public class FortunesPostgresqlGetHandler implements HttpHandler {
 
     @Override
     public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
         List<Fortune> fortunes = new ArrayList<>();
         try (Connection connection = ds.getConnection();
              PreparedStatement statement = connection.prepareStatement(

+ 0 - 57
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesMysqlGetHandler.java

@@ -1,57 +0,0 @@
-package com.networknt.techempower.handler;
-
-import com.dslplatform.json.DslJson;
-import com.dslplatform.json.JsonWriter;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.networknt.config.Config;
-import com.networknt.techempower.Helper;
-import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
-import com.networknt.techempower.model.World;
-import io.undertow.server.HttpHandler;
-import io.undertow.server.HttpServerExchange;
-import io.undertow.util.Headers;
-import io.undertow.util.HttpString;
-
-import java.nio.ByteBuffer;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-
-import javax.sql.DataSource;
-
-public class QueriesMysqlGetHandler implements HttpHandler {
-    private final DataSource ds = MysqlStartupHookProvider.ds;
-    private DslJson<Object> dsl = new DslJson<>();
-    private JsonWriter writer = dsl.newWriter(1024);
-
-    @Override
-    public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
-
-        int queries = Helper.getQueries(exchange);
-
-        List<CompletableFuture<World>> worlds = IntStream.range(0, queries)
-                .mapToObj(i -> CompletableFuture.supplyAsync(() -> Helper.selectWorld(ds), Helper.executor))
-                .collect(Collectors.toList());
-
-        CompletableFuture<List<World>> allDone = Helper.sequence(worlds);
-        writer.reset();
-        writer.serialize(allDone.get());
-        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
-    }
-}

+ 19 - 12
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesPostgresqlGetHandler.java

@@ -26,6 +26,8 @@ import org.apache.commons.lang3.StringEscapeUtils;
 
 import javax.sql.DataSource;
 
+import static com.networknt.techempower.Helper.randomWorld;
+
 public class QueriesPostgresqlGetHandler implements HttpHandler {
     private final DataSource ds = PostgresStartupHookProvider.ds;
     private DslJson<Object> dsl = new DslJson<>();
@@ -33,22 +35,27 @@ public class QueriesPostgresqlGetHandler implements HttpHandler {
 
     @Override
     public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
-
         int queries = Helper.getQueries(exchange);
 
-        List<CompletableFuture<World>> worlds = IntStream.range(0, queries)
-                .mapToObj(i -> CompletableFuture.supplyAsync(() -> Helper.selectWorld(ds), Helper.executor))
-                .collect(Collectors.toList());
+        World[] worlds = new World[queries];
+        try (Connection connection = ds.getConnection();
+             PreparedStatement statement =
+                     connection.prepareStatement("SELECT * FROM World WHERE id = ?")) {
+            for (int i = 0; i < worlds.length; i++) {
+                statement.setInt(1, randomWorld());
+                try (ResultSet resultSet = statement.executeQuery()) {
+                    resultSet.next();
+                    int id = resultSet.getInt("id");
+                    int randomNumber = resultSet.getInt("randomNumber");
+                    worlds[i] = new World(id, randomNumber);
+                }
+            }
+        }
 
-        CompletableFuture<List<World>> allDone = Helper.sequence(worlds);
         writer.reset();
-        writer.serialize(allDone.get());
+        writer.serialize(worlds);
+
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
         exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
     }
-
 }

+ 0 - 40
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesMysqlGetHandler.java

@@ -1,40 +0,0 @@
-package com.networknt.techempower.handler;
-
-import com.dslplatform.json.DslJson;
-import com.dslplatform.json.JsonWriter;
-import com.networknt.techempower.Helper;
-import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
-import com.networknt.techempower.model.World;
-import io.undertow.server.HttpHandler;
-import io.undertow.server.HttpServerExchange;
-
-import javax.sql.DataSource;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-public class UpdatesMysqlGetHandler implements HttpHandler {
-    private final DataSource ds = MysqlStartupHookProvider.ds;
-    private DslJson<Object> dsl = new DslJson<>();
-    private JsonWriter writer = dsl.newWriter(1024);
-
-    @Override
-    public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
-        int queries = Helper.getQueries(exchange);
-
-        List<CompletableFuture<World>> worlds = IntStream.range(0, queries)
-                .mapToObj(i -> CompletableFuture.supplyAsync(() -> Helper.updateWorld(ds), Helper.executor))
-                .collect(Collectors.toList());
-
-        CompletableFuture<List<World>> allDone = Helper.sequence(worlds);
-        writer.reset();
-        writer.serialize(allDone.get());
-        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
-    }
-}

+ 30 - 9
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesPostgresqlGetHandler.java

@@ -29,6 +29,8 @@ import org.apache.commons.lang3.StringEscapeUtils;
 
 import javax.sql.DataSource;
 
+import static com.networknt.techempower.Helper.randomWorld;
+
 public class UpdatesPostgresqlGetHandler implements HttpHandler {
     private final DataSource ds = PostgresStartupHookProvider.ds;
     private DslJson<Object> dsl = new DslJson<>();
@@ -36,19 +38,38 @@ public class UpdatesPostgresqlGetHandler implements HttpHandler {
 
     @Override
     public void handleRequest(HttpServerExchange exchange) throws Exception {
-        if (exchange.isInIoThread()) {
-            exchange.dispatch(this);
-            return;
-        }
         int queries = Helper.getQueries(exchange);
 
-        List<CompletableFuture<World>> worlds = IntStream.range(0, queries)
-                .mapToObj(i -> CompletableFuture.supplyAsync(() -> Helper.updateWorld(ds), Helper.executor))
-                .collect(Collectors.toList());
+        World[] worlds = new World[queries];
+        try (Connection connection = ds.getConnection()) {
+            try (PreparedStatement statement =
+                         connection.prepareStatement(
+                                 "SELECT * FROM World WHERE id = ?")) {
+                for (int i = 0; i < worlds.length; i++) {
+                    statement.setInt(1, randomWorld());
+                    try (ResultSet resultSet = statement.executeQuery()) {
+                        resultSet.next();
+                        int id = resultSet.getInt("id");
+                        int randomNumber = resultSet.getInt("randomNumber");
+                        worlds[i] = new World(id, randomNumber);
+                    }
+                }
+            }
+            try (PreparedStatement statement =
+                         connection.prepareStatement(
+                                 "UPDATE World SET randomNumber = ? WHERE id = ?")) {
+                for (World world : worlds) {
+                    world.randomNumber = randomWorld();
+                    statement.setInt(1, world.randomNumber);
+                    statement.setInt(2, world.id);
+                    statement.executeUpdate();
+                }
+            }
+        }
 
-        CompletableFuture<List<World>> allDone = Helper.sequence(worlds);
         writer.reset();
-        writer.serialize(allDone.get());
+        writer.serialize(worlds);
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
         exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
     }
 }