UpdatesSqlHandler.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package hello;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.google.common.net.MediaType;
  4. import io.undertow.server.HttpHandler;
  5. import io.undertow.server.HttpServerExchange;
  6. import io.undertow.util.Headers;
  7. import javax.sql.DataSource;
  8. import java.sql.Connection;
  9. import java.sql.PreparedStatement;
  10. import java.sql.ResultSet;
  11. import java.util.Objects;
  12. import static hello.HelloWebServer.JSON_UTF8;
  13. /**
  14. * Handles the updates test using a SQL database.
  15. */
  16. final class UpdatesSqlHandler implements HttpHandler {
  17. private final ObjectMapper objectMapper;
  18. private final DataSource database;
  19. UpdatesSqlHandler(ObjectMapper objectMapper, DataSource database) {
  20. this.objectMapper = Objects.requireNonNull(objectMapper);
  21. this.database = Objects.requireNonNull(database);
  22. }
  23. @Override
  24. public void handleRequest(HttpServerExchange exchange) throws Exception {
  25. if (exchange.isInIoThread()) {
  26. exchange.dispatch(this);
  27. return;
  28. }
  29. int queries = Helper.getQueries(exchange);
  30. World[] worlds = new World[queries];
  31. try (Connection connection = database.getConnection();
  32. PreparedStatement query = connection.prepareStatement(
  33. "SELECT * FROM World WHERE id = ?",
  34. ResultSet.TYPE_FORWARD_ONLY,
  35. ResultSet.CONCUR_READ_ONLY);
  36. PreparedStatement update = connection.prepareStatement(
  37. "UPDATE World SET randomNumber = ? WHERE id= ?")) {
  38. for (int i = 0; i < queries; i++) {
  39. query.setInt(1, Helper.randomWorld());
  40. World world;
  41. try (ResultSet resultSet = query.executeQuery()) {
  42. resultSet.next();
  43. world = new World(
  44. resultSet.getInt("id"),
  45. resultSet.getInt("randomNumber"));
  46. }
  47. world.randomNumber = Helper.randomWorld();
  48. update.setInt(1, world.randomNumber);
  49. update.setInt(2, world.id);
  50. update.executeUpdate();
  51. worlds[i] = world;
  52. }
  53. }
  54. exchange.getResponseHeaders().put(
  55. Headers.CONTENT_TYPE, JSON_UTF8);
  56. exchange.getResponseSender().send(objectMapper.writeValueAsString(worlds));
  57. }
  58. }