DbResource.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package hello;
  2. import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
  3. import hello.domain.World;
  4. import java.util.Map;
  5. import java.util.Random;
  6. import java.util.concurrent.Callable;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. import java.util.concurrent.ExecutionException;
  9. import java.util.concurrent.Future;
  10. import java.util.concurrent.ThreadLocalRandom;
  11. import javax.ws.rs.GET;
  12. import javax.ws.rs.Path;
  13. import javax.ws.rs.Produces;
  14. import javax.ws.rs.QueryParam;
  15. import javax.ws.rs.core.Context;
  16. import org.hibernate.IdentifierLoadAccess;
  17. import org.hibernate.Session;
  18. import org.hibernate.SessionFactory;
  19. import com.sun.jersey.spi.resource.Singleton;
  20. @Singleton
  21. @Path("/db")
  22. public class DbResource {
  23. private static final int DB_ROWS = 10000;
  24. @Context
  25. private SessionFactory sessionFactory;
  26. @GET
  27. @Produces(APPLICATION_JSON + "; charset=utf-8")
  28. public Object db(@QueryParam("queries") String queriesParam)
  29. throws ExecutionException, InterruptedException {
  30. final int queries = getQueries(queriesParam);
  31. final World[] worlds = new World[queries];
  32. final Random random = ThreadLocalRandom.current();
  33. final Session session = sessionFactory.openSession();
  34. session.setDefaultReadOnly(true);
  35. final IdentifierLoadAccess accessor = session.byId(World.class);
  36. Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
  37. for (int i = 0; i < queries; i++) {
  38. futureWorlds.put(i, Common.EXECUTOR.submit(
  39. new Callable<World>() {
  40. @Override
  41. public World call() throws Exception {
  42. return (World) accessor.load(random.nextInt(DB_ROWS) + 1);
  43. }
  44. }
  45. ));
  46. }
  47. for (int i = 0; i < queries; i++) {
  48. worlds[i] = futureWorlds.get(i).get();
  49. }
  50. return queries == 1 ? worlds[0] : worlds;
  51. }
  52. private int getQueries(String proto) {
  53. int result = 1;
  54. try {
  55. if (proto != null) {
  56. result = Integer.parseInt(proto);
  57. }
  58. } catch (NumberFormatException e) {
  59. e.printStackTrace();
  60. }
  61. return Math.min(500, Math.max(1, result));
  62. }
  63. }