Browse Source

optimize performance (#5804)

* update smart-http to 1.0.15-SNAPSHOT

* optimize performance

* update smart-http to 1.0.15

* update aio-enhance to 1.0.1-SNAPSHOT

* optimize performance

* optimize performance

Co-authored-by: 三刀 <[email protected]>
三刀 5 years ago
parent
commit
d54deb6673

+ 5 - 4
frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java

@@ -24,10 +24,10 @@ public class MultipleQueriesHandler extends HttpHandle {
 
     @Override
     public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException {
+        int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
+        World[] worlds = new World[queries];
         try (Connection connection = dataSource.getConnection();
              PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
-            int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
-            World[] worlds = new World[queries];
 
             for (int i = 0; i < queries; i++) {
                 preparedStatement.setInt(1, getRandomNumber());
@@ -39,11 +39,12 @@ public class MultipleQueriesHandler extends HttpHandle {
                 worlds[i] = world;
                 preparedStatement.clearParameters();
             }
-            response.setContentType("application/json");
-            JsonUtil.writeJsonBytes(response, worlds);
+
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         }
+        response.setContentType("application/json");
+        JsonUtil.writeJsonBytes(response, worlds);
     }
 
     protected int getRandomNumber() {

+ 3 - 3
frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java

@@ -23,19 +23,19 @@ public class SingleQueryHandler extends HttpHandle {
 
     @Override
     public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException {
+        World world = new World();
         try (Connection connection = dataSource.getConnection();
              PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
             preparedStatement.setInt(1, getRandomNumber());
             ResultSet resultSet = preparedStatement.executeQuery();
             resultSet.next();
-            World world = new World();
             world.setId(resultSet.getInt(1));
             world.setRandomNumber(resultSet.getInt(2));
-            response.setContentType("application/json");
-            JsonUtil.writeJsonBytes(response, world);
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         }
+        response.setContentType("application/json");
+        JsonUtil.writeJsonBytes(response, world);
     }
 
     protected int getRandomNumber() {

+ 31 - 23
frameworks/Java/smart-socket/src/main/java/org/smartboot/http/UpdateHandler.java

@@ -9,6 +9,7 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.StringJoiner;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
@@ -24,35 +25,42 @@ public class UpdateHandler extends HttpHandle {
 
     @Override
     public void doHandle(HttpRequest httpRequest, HttpResponse response) throws IOException {
-        try (Connection connection = dataSource.getConnection();
-             PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");
-             PreparedStatement preparedStatement = connection.prepareStatement("UPDATE world SET randomnumber=? WHERE id=?");) {
-            int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
-            World[] worlds = new World[queries];
-
-            for (int i = 0; i < queries; i++) {
-                queryPreparedStatement.setInt(1, getRandomNumber());
-                ResultSet resultSet = queryPreparedStatement.executeQuery();
-                resultSet.next();
-                World world = new World();
-                world.setId(resultSet.getInt(1));
-                world.setRandomNumber(resultSet.getInt(2));
-                worlds[i] = world;
-                worlds[i].setRandomNumber(getRandomNumber());
-                queryPreparedStatement.clearParameters();
+        int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
+        World[] worlds = new World[queries];
+        StringJoiner updateSql = new StringJoiner(
+                ", ",
+                "UPDATE world SET randomnumber = temp.randomnumber FROM (VALUES ",
+                " ORDER BY 1) AS temp(id, randomnumber) WHERE temp.id = world.id");
+        try (Connection connection = dataSource.getConnection()) {
+
+            try (PreparedStatement queryPreparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
+                for (int i = 0; i < queries; i++) {
+                    queryPreparedStatement.setInt(1, getRandomNumber());
+                    ResultSet resultSet = queryPreparedStatement.executeQuery();
+                    resultSet.next();
+                    World world = new World();
+                    world.setId(resultSet.getInt(1));
+                    world.setRandomNumber(getRandomNumber());
+                    worlds[i] = world;
+                    queryPreparedStatement.clearParameters();
+                    updateSql.add("(?, ?)");
+                }
             }
 
-            for (int i = 0; i < queries; i++) {
-                preparedStatement.setInt(1, worlds[i].getRandomNumber());
-                preparedStatement.setInt(2, worlds[i].getId());
-                preparedStatement.addBatch();
+            try (PreparedStatement preparedStatement = connection.prepareStatement(updateSql.toString());) {
+                int i = 0;
+                for (World world : worlds) {
+                    preparedStatement.setInt(++i, world.getId());
+                    preparedStatement.setInt(++i, world.getRandomNumber());
+                }
+                preparedStatement.executeUpdate();
             }
-            preparedStatement.executeBatch();
-            response.setContentType("application/json");
-            JsonUtil.writeJsonBytes(response, worlds);
+
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         }
+        response.setContentType("application/json");
+        JsonUtil.writeJsonBytes(response, worlds);
     }
 
     protected int getRandomNumber() {