Browse Source

Statements close result sets, so can't be reused when declared in "try with resource" fashion

denka 10 years ago
parent
commit
7aa7ef5058

+ 7 - 7
frameworks/Java/undertow/src/main/java/hello/DbSqlHandler.java

@@ -47,18 +47,18 @@ final class DbSqlHandler implements HttpHandler {
     }
     
     World[] worlds = new World[queries];
-    try (Connection connection = database.getConnection();
-         final PreparedStatement statement = connection.prepareStatement(
-             "SELECT * FROM World WHERE id = ?",
-             ResultSet.TYPE_FORWARD_ONLY,
-             ResultSet.CONCUR_READ_ONLY)) {
+    try (final Connection connection = database.getConnection()) {
       Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
       for (int i = 0; i < queries; i++) {
         futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>(){
           @Override
           public World call() throws Exception {
-            statement.setInt(1, Helper.randomWorld());
-            try (ResultSet resultSet = statement.executeQuery()) {
+            try (PreparedStatement statement = connection.prepareStatement(
+                "SELECT * FROM World WHERE id = ?",
+                ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+              statement.setInt(1, Helper.randomWorld());
+              ResultSet resultSet = statement.executeQuery();
               resultSet.next();
               return new World(
                 resultSet.getInt("id"),

+ 19 - 18
frameworks/Java/undertow/src/main/java/hello/UpdatesSqlHandler.java

@@ -37,31 +37,32 @@ final class UpdatesSqlHandler implements HttpHandler {
     }
     int queries = Helper.getQueries(exchange);
     World[] worlds = new World[queries];
-    try (Connection connection = database.getConnection();
-         final PreparedStatement query = connection.prepareStatement(
-             "SELECT * FROM World WHERE id = ?",
-             ResultSet.TYPE_FORWARD_ONLY,
-             ResultSet.CONCUR_READ_ONLY);
-         final PreparedStatement update = connection.prepareStatement(
-             "UPDATE World SET randomNumber = ? WHERE id= ?")) {
+    try (final Connection connection = database.getConnection()) {
       Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
       for (int i = 0; i < queries; i++) {
         futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>() {
           @Override
           public World call() throws Exception {
-            query.setInt(1, Helper.randomWorld());
             World world;
-            try (ResultSet resultSet = query.executeQuery()) {
-              resultSet.next();
-              world = new World(
-                resultSet.getInt("id"),
-                resultSet.getInt("randomNumber"));
+            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());
+                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;
             }
-            world.randomNumber = Helper.randomWorld();
-            update.setInt(1, world.randomNumber);
-            update.setInt(2, world.id);
-            update.executeUpdate();
-            return world;
           }
         }));
       }