HelloDbUpdatesResource.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package hellowicket.dbupdates;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6. import org.apache.wicket.request.resource.AbstractResource;
  7. import org.hibernate.CacheMode;
  8. import org.hibernate.Query;
  9. import org.hibernate.ScrollMode;
  10. import org.hibernate.ScrollableResults;
  11. import org.hibernate.Session;
  12. import com.fasterxml.jackson.databind.ObjectMapper;
  13. import hellowicket.HibernateUtil;
  14. import hellowicket.World;
  15. import org.hibernate.Transaction;
  16. /**
  17. * A resource that implements the requirements for
  18. * <a href="http://www.techempower.com/benchmarks/#section=code">Test type 5: Database updates</a>
  19. */
  20. public class HelloDbUpdatesResource extends AbstractResource
  21. {
  22. private static final long serialVersionUID = 1L;
  23. private static final int DB_ROWS = 10000;
  24. private static final ObjectMapper mapper = new ObjectMapper();
  25. protected ResourceResponse newResourceResponse(Attributes attributes)
  26. {
  27. int _queries = attributes.getRequest().getQueryParameters().getParameterValue("queries").toInt(1);
  28. if (_queries < 1)
  29. {
  30. _queries = 1;
  31. }
  32. else if (_queries > 500)
  33. {
  34. _queries = 500;
  35. }
  36. final int queries = _queries;
  37. final ResourceResponse response = new ResourceResponse();
  38. response.setContentType("application/json");
  39. response.setWriteCallback(new WriteCallback() {
  40. public void writeData(Attributes attributes)
  41. {
  42. Random random = new Random();
  43. List<World> worldsForJson = new ArrayList<>();
  44. Session session = HibernateUtil.getSessionFactory().openSession();
  45. Transaction tx = session.beginTransaction();
  46. // update in batches. See http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update
  47. ScrollableResults worlds = session.createQuery("from World")
  48. .setMaxResults(queries)
  49. .setCacheMode(CacheMode.IGNORE)
  50. .scroll(ScrollMode.FORWARD_ONLY);
  51. int count=0;
  52. while (worlds.next())
  53. {
  54. World world = (World) worlds.get(0);
  55. world.randomNumber = random.nextInt(DB_ROWS) + 1;
  56. worldsForJson.add(world);
  57. if ( ++count % 500 == 0 )
  58. {
  59. //flush a batch of updates and release memory
  60. session.flush();
  61. session.clear();
  62. }
  63. }
  64. tx.commit();
  65. session.close();
  66. try
  67. {
  68. String data;
  69. if (queries == 1)
  70. {
  71. data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson.get(0));
  72. }
  73. else
  74. {
  75. data = HelloDbUpdatesResource.mapper.writeValueAsString(worldsForJson);
  76. }
  77. attributes.getResponse().write(data);
  78. }
  79. catch (IOException ex)
  80. {
  81. // do nothing
  82. }
  83. }
  84. });
  85. return response;
  86. }
  87. }