Browse Source

Merge branch 'wicket-5-database-updates' of https://github.com/martin-g/FrameworkBenchmarks into PR656

Conflicts:
	wicket/benchmark_config
	wicket/source_code
	wicket/src/main/java/hellowicket/WicketApplication.java
Mike Smith 11 years ago
parent
commit
a7ceb149b0

+ 2 - 1
wicket/benchmark_config

@@ -5,8 +5,9 @@
       "setup_file": "setup",
       "setup_file": "setup",
       "json_url": "/wicket/json",
       "json_url": "/wicket/json",
       "db_url": "/wicket/db",
       "db_url": "/wicket/db",
-      "plaintext_url": "/wicket/plaintext",
       "query_url": "/wicket/db?queries=",
       "query_url": "/wicket/db?queries=",
+      "update_url": "/wicket/updates?queries=",
+      "plaintext_url": "/wicket/plaintext",
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",

+ 2 - 0
wicket/source_code

@@ -13,6 +13,8 @@
 ./wicket/src/main/java/hellowicket/World.java
 ./wicket/src/main/java/hellowicket/World.java
 ./wicket/src/main/java/hellowicket/plaintext/HelloTextReference.java
 ./wicket/src/main/java/hellowicket/plaintext/HelloTextReference.java
 ./wicket/src/main/java/hellowicket/plaintext/HelloTextResource.java
 ./wicket/src/main/java/hellowicket/plaintext/HelloTextResource.java
+./wicket/src/main/java/hellowicket/dbupdates/HelloDbUpdatesResource.java
+./wicket/src/main/java/hellowicket/dbupdates/HelloDbUpdatesReference.java
 ./wicket/src/main/webapp/
 ./wicket/src/main/webapp/
 ./wicket/src/main/webapp/logo.png
 ./wicket/src/main/webapp/logo.png
 ./wicket/src/main/webapp/style.css
 ./wicket/src/main/webapp/style.css

+ 2 - 0
wicket/src/main/java/hellowicket/WicketApplication.java

@@ -1,6 +1,7 @@
 package hellowicket;
 package hellowicket;
 
 
 import hellowicket.plaintext.HelloTextReference;
 import hellowicket.plaintext.HelloTextReference;
+import hellowicket.dbupdates.HelloDbUpdatesReference;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.WebApplication;
 
 
 /**
 /**
@@ -32,6 +33,7 @@ public class WicketApplication extends WebApplication
 		// mount the resources under test
 		// mount the resources under test
 		mountResource("/json", new HelloJsonReference());
 		mountResource("/json", new HelloJsonReference());
 		mountResource("/db", new HelloDbReference());
 		mountResource("/db", new HelloDbReference());
+		mountResource("/updates", new HelloDbUpdatesReference());
 		mountResource("/plaintext", new HelloTextReference());
 		mountResource("/plaintext", new HelloTextReference());
 
 
 		// disable response caching to be more close to other
 		// disable response caching to be more close to other

+ 22 - 0
wicket/src/main/java/hellowicket/dbupdates/HelloDbUpdatesReference.java

@@ -0,0 +1,22 @@
+package hellowicket.dbupdates;
+
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+
+public class HelloDbUpdatesReference extends ResourceReference
+{
+  private static final long serialVersionUID = 1L;
+
+  private final HelloDbUpdatesResource resource = new HelloDbUpdatesResource();
+
+  public HelloDbUpdatesReference()
+  {
+    super(HelloDbUpdatesReference.class, "dbupdates");
+  }
+
+  @Override
+  public IResource getResource()
+  {
+	  return resource;
+  }
+}

+ 102 - 0
wicket/src/main/java/hellowicket/dbupdates/HelloDbUpdatesResource.java

@@ -0,0 +1,102 @@
+package hellowicket.dbupdates;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.wicket.request.resource.AbstractResource;
+import org.hibernate.CacheMode;
+import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import hellowicket.HibernateUtil;
+import hellowicket.World;
+import org.hibernate.Transaction;
+
+/**
+ * A resource that implements the requirements for
+ * <a href="http://www.techempower.com/benchmarks/#section=code">Test type 5: Database updates</a>
+ */
+public class HelloDbUpdatesResource extends AbstractResource
+{
+  private static final long serialVersionUID = 1L;
+
+  private static final int DB_ROWS = 10000;
+
+  private static final ObjectMapper mapper = new ObjectMapper();
+
+  protected ResourceResponse newResourceResponse(Attributes attributes)
+  {
+    int _queries = attributes.getRequest().getQueryParameters().getParameterValue("queries").toInt(1);
+    if (_queries < 1)
+    {
+      _queries = 1;
+    }
+    else if (_queries > 500)
+    {
+      _queries = 500;
+    }
+    final int queries = _queries;
+
+    final ResourceResponse response = new ResourceResponse();
+    response.setContentType("application/json");
+
+    response.setWriteCallback(new WriteCallback() {
+      public void writeData(Attributes attributes)
+      {
+        Random random = new Random();
+
+        List<World> worldsForJson = new ArrayList<>();
+
+        Session session = HibernateUtil.getSessionFactory().openSession();
+        Transaction tx = session.beginTransaction();
+
+        // update in batches. See http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update
+        ScrollableResults worlds = session.createQuery("from World")
+           .setMaxResults(queries)
+           .setCacheMode(CacheMode.IGNORE)
+           .scroll(ScrollMode.FORWARD_ONLY);
+        int count=0;
+        while (worlds.next())
+        {
+          World world = (World) worlds.get(0);
+          world.randomNumber = random.nextInt(DB_ROWS) + 1;
+          worldsForJson.add(world);
+          if ( ++count % 500 == 0 )
+          {
+            //flush a batch of updates and release memory
+            session.flush();
+            session.clear();
+          }
+        }
+
+        tx.commit();
+        session.close();
+
+        try
+        {
+          String data;
+          if (queries == 1)
+          {
+              data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson.get(0));
+          }
+          else
+          {
+              data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson);
+          }
+          attributes.getResponse().write(data);
+        }
+        catch (IOException ex)
+        {
+          // do nothing
+        }
+      }
+    });
+    return response;
+  }
+}

+ 6 - 1
wicket/src/main/resources/hibernate.cfg.xml

@@ -4,7 +4,7 @@
 <hibernate-configuration>
 <hibernate-configuration>
     <session-factory>
     <session-factory>
         <property name="hibernate.connection.datasource">java:comp/env/jdbc/hello_world</property>
         <property name="hibernate.connection.datasource">java:comp/env/jdbc/hello_world</property>
- 
+
         <!-- SQL dialect -->
         <!-- SQL dialect -->
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  
  
@@ -13,6 +13,11 @@
         <property name="hibernate.cache.use_query_cache">false</property>
         <property name="hibernate.cache.use_query_cache">false</property>
         <property name="hibernate.current_session_context_class">thread</property>
         <property name="hibernate.current_session_context_class">thread</property>
 
 
+        <!-- batch the updates for /updates
+          World object is small so we can batch many
+         -->
+        <property name="hibernate.jdbc.batch_size">500</property>
+
         <mapping class="hellowicket.World" />
         <mapping class="hellowicket.World" />
     </session-factory>
     </session-factory>
 </hibernate-configuration>
 </hibernate-configuration>