DbSqlHandler.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 single- and multiple-query database tests using a SQL database.
  15. */
  16. final class DbSqlHandler implements HttpHandler {
  17. private final ObjectMapper objectMapper;
  18. private final DataSource database;
  19. DbSqlHandler(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 statement = connection.prepareStatement(
  33. "SELECT * FROM World WHERE id = ?",
  34. ResultSet.TYPE_FORWARD_ONLY,
  35. ResultSet.CONCUR_READ_ONLY)) {
  36. for (int i = 0; i < queries; i++) {
  37. statement.setInt(1, Helper.randomWorld());
  38. try (ResultSet resultSet = statement.executeQuery()) {
  39. resultSet.next();
  40. worlds[i] = new World(
  41. resultSet.getInt("id"),
  42. resultSet.getInt("randomNumber"));
  43. }
  44. }
  45. }
  46. exchange.getResponseHeaders().put(
  47. Headers.CONTENT_TYPE, JSON_UTF8);
  48. exchange.getResponseSender().send(objectMapper.writeValueAsString(worlds));
  49. }
  50. }