HelloDbController.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package hello.controllers;
  2. import hello.dao.WorldDao;
  3. import hello.model.World;
  4. import java.util.Random;
  5. import java.util.concurrent.ThreadLocalRandom;
  6. import ninja.Result;
  7. import ninja.Results;
  8. import com.google.inject.Inject;
  9. import com.google.inject.Singleton;
  10. import com.google.inject.persist.Transactional;
  11. import ninja.params.Param;
  12. @Singleton
  13. public class HelloDbController {
  14. private static final int DB_ROWS = 10000;
  15. private final Random random = ThreadLocalRandom.current();
  16. @Inject
  17. WorldDao worldDao;
  18. public Result singleGet() {
  19. return Results.json().render(getRandomWorld());
  20. }
  21. // @Transactional is important here as it encapsulates all
  22. // JPA calls in dependent methods inside one - and only one -
  23. // transaction. Otherwise WorldDao would open x new transactions what
  24. // is of course slower than only having one encapsulating transaction.
  25. @Transactional
  26. public Result multiGet(@Param("queries") Integer queries) {
  27. if (queries == null || queries < 1) {
  28. queries = 1;
  29. }
  30. if (queries > 500) {
  31. queries = 500;
  32. }
  33. final World[] worlds = new World[queries];
  34. for (int i = 0; i < queries; i++) {
  35. worlds[i] = getRandomWorld();
  36. }
  37. return Results.json().render(worlds);
  38. }
  39. // @Transactional is important here as it encapsulates all
  40. // JPA calls in dependent methods inside one - and only one -
  41. // transaction. Otherwise WorldDao would open x new transactions what
  42. // is of course slower than only having one encapsulating transaction.
  43. @Transactional
  44. public Result update(@Param("queries") Integer queries) {
  45. if (queries == null || queries < 1) {
  46. queries = 1;
  47. }
  48. if (queries > 500) {
  49. queries = 500;
  50. }
  51. final World[] worlds = new World[queries];
  52. for (int i = 0; i < queries; i++) {
  53. worlds[i] = getRandomWorld();
  54. }
  55. // now update stuff:
  56. for (World world : worlds) {
  57. world.randomNumber = random.nextInt();
  58. worldDao.put(world);
  59. }
  60. return Results.json().render(worlds);
  61. }
  62. private World getRandomWorld() {
  63. return worldDao.get(random.nextInt(DB_ROWS) + 1);
  64. }
  65. }