Pārlūkot izejas kodu

Java/dropwizard - Remove additional array creation in update test (#4852)

* Dropwizard JDBI update clean up

* Optimize query test - multiple queries

* Add missing option for autocommit
Radoslav Petrov 6 gadi atpakaļ
vecāks
revīzija
319fc28d21

+ 3 - 0
frameworks/Java/dropwizard/hello-world-jdbi-postgres.yml

@@ -52,3 +52,6 @@ database:
 
   # disable comments in SQL queries
   autoCommentsEnabled: false
+
+  # disable autocommit in the JDBC driver
+  autoCommitByDefault: false

+ 1 - 0
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/WorldDAO.java

@@ -4,6 +4,7 @@ import com.example.helloworld.db.model.World;
 
 public interface WorldDAO {
     World findById(int id);
+    World[] findById(int[] ids);
     World findAndModify(int id, int newRandomNumber);
     World[] updatesQueries(int queries);
 }

+ 9 - 0
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/hibernate/WorldHibernateImpl.java

@@ -18,6 +18,15 @@ public class WorldHibernateImpl extends AbstractDAO<World> implements WorldDAO {
 		return get(id);
 	}
 
+	@Override
+	public World[] findById(int[] ids) {
+		World[] worlds = new World[ids.length];
+		for(int i = 0; i < ids.length; i++) {
+			worlds[i] = get(ids[i]);
+		}
+		return worlds;
+	}
+	
 	public World findAndModify(int id, int newRandomNumber) {
 		final World world = get(id);
 		world.setRandomNumber(newRandomNumber);

+ 3 - 0
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/WorldJDBIImpl.java

@@ -4,10 +4,12 @@ import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
 
 import com.example.helloworld.db.mappers.WorldMapper;
 import com.example.helloworld.db.model.World;
+
 import org.jdbi.v3.sqlobject.customizer.Bind;
 import org.jdbi.v3.sqlobject.customizer.BindBean;
 import org.jdbi.v3.sqlobject.statement.SqlBatch;
 import org.jdbi.v3.sqlobject.statement.SqlQuery;
+import org.jdbi.v3.sqlobject.transaction.Transaction;
 
 @RegisterRowMapper(WorldMapper.class)
 public interface WorldJDBIImpl {
@@ -15,5 +17,6 @@ public interface WorldJDBIImpl {
 	World findById(@Bind("id") int id);
 
 	@SqlBatch("update world set randomNumber = :p.randomNumber where id = :p.id")
+	@Transaction
 	void update(@BindBean("p") World...worlds);
 }

+ 27 - 16
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/WorldRepository.java

@@ -1,15 +1,15 @@
 package com.example.helloworld.db.jdbi;
 
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.jdbi.v3.core.Handle;
 import org.jdbi.v3.core.Jdbi;
 
 import com.example.helloworld.db.WorldDAO;
 import com.example.helloworld.db.model.World;
 import com.example.helloworld.resources.Helper;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
 public class WorldRepository implements WorldDAO {
 	private final Jdbi jdbi;
 
@@ -22,6 +22,18 @@ public class WorldRepository implements WorldDAO {
 		return jdbi.withExtension(WorldJDBIImpl.class, dao -> dao.findById(id));
 	}
 
+
+	@Override
+	public World[] findById(int[] ids) {
+		return jdbi.withExtension(WorldJDBIImpl.class, dao -> {
+			World[] worlds = new World[ids.length];
+			for(int i = 0; i < ids.length; i++) {
+				worlds[i] = dao.findById(ids[i]);
+			}
+			return worlds;
+		});
+	}
+	
 	@Override
 	public World findAndModify(int id, int newRandomNumber) {
 		throw new RuntimeException("Don't call this");
@@ -29,24 +41,23 @@ public class WorldRepository implements WorldDAO {
 
 	@Override
 	public World[] updatesQueries(int totalQueries) {
-		return jdbi.withExtension(WorldJDBIImpl.class, dao -> {
-			final List<World> updates = new ArrayList<>(totalQueries);
+		try (Handle handle = jdbi.open()) {
+			WorldJDBIImpl dao = handle.attach(WorldJDBIImpl.class);
+
+			final World updates[] = new World[totalQueries];
 
 			for (int i = 0; i < totalQueries; i++) {
 				final World world = dao.findById(Helper.randomWorld());
 				world.setRandomNumber(Helper.randomWorld());
-				updates.add(i, world);
+				updates[i] = world;
 			}
-
 			// Reason for sorting : https://github.com/TechEmpower/FrameworkBenchmarks/pull/2684
-			updates.sort(Comparator.comparingInt(World::getId));
-
-			final World[] updatesArray = updates.toArray(new World[totalQueries]);
-
-			dao.update(updatesArray);
-
-			return updatesArray;
-		});
+			Arrays.sort(updates, Comparator.comparingInt(World::getId));
+			dao.update(updates);
+			handle.commit();
+			
+			return updates;
+		}
 	}
 
 }

+ 14 - 5
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/mongo/WorldMongoImpl.java

@@ -1,14 +1,13 @@
 package com.example.helloworld.db.mongo;
 
-import com.example.helloworld.db.WorldDAO;
-import com.example.helloworld.db.model.World;
-import com.example.helloworld.resources.Helper;
-import org.mongojack.DBUpdate;
 import org.mongojack.DBProjection;
-import org.mongojack.DBQuery;
 import org.mongojack.DBUpdate;
 import org.mongojack.JacksonDBCollection;
 
+import com.example.helloworld.db.WorldDAO;
+import com.example.helloworld.db.model.World;
+import com.example.helloworld.resources.Helper;
+
 public class WorldMongoImpl implements WorldDAO {
 
     private final JacksonDBCollection<World, Integer> worldCollection;
@@ -22,6 +21,15 @@ public class WorldMongoImpl implements WorldDAO {
         return worldCollection.findOneById(id, DBProjection.include("_id", "randomNumber"));
     }
 
+    @Override
+	public World[] findById(int[] ids) {
+    	World[] worlds = new World[ids.length];
+		for(int i = 0; i < ids.length; i++) {
+			worlds[i] = findById(ids[i]);
+		}
+		return worlds;
+	}
+    
     @Override
     public World findAndModify(int worldId, int newRandomNumber) {
         World theOne = findById(worldId);
@@ -39,4 +47,5 @@ public class WorldMongoImpl implements WorldDAO {
         }
         return worlds;
     }
+
 }

+ 4 - 4
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/resources/WorldResource.java

@@ -31,13 +31,13 @@ public class WorldResource {
 	@GET
 	@Path("/query")
 	@UnitOfWork(transactional = false,  readOnly = true) // Needed only for Hibernate - not for Mongo or JDBI
-	public Object dbTest(@QueryParam("queries") String queries) {
+	public Object query(@QueryParam("queries") String queries) {
 		int totalQueries = Helper.getQueries(queries); // Optional check is done inside
-		final World[] worlds = new World[totalQueries];
+		int[] ids = new int[totalQueries];
 		for (int i = 0; i < totalQueries; i++) {
-			worlds[i] = worldDAO.findById(Helper.randomWorld());
+			ids[i] = Helper.randomWorld();
 		}
-		return worlds;
+		return worldDAO.findById(ids);
 	}
 
 	@GET