Package hellowicket.dbupdates

Source Code of hellowicket.dbupdates.HelloDbUpdatesResource

package hellowicket.dbupdates;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.concurrent.ThreadLocalRandom;

import javax.sql.DataSource;

import org.apache.wicket.request.resource.AbstractResource;

import com.fasterxml.jackson.databind.ObjectMapper;

import hellowicket.WicketApplication;
import hellowicket.World;

/**
* A resource that implements the requirements for
* <a href="http://www.techempower.com/benchmarks/#section=code">Test type 5: Database updates</a>
*/
public class HelloDbUpdatesResource extends AbstractResource
{
  private static final long serialVersionUID = 1L;

  private static final int DB_ROWS = 10000;

  private static final ObjectMapper mapper = new ObjectMapper();

  protected ResourceResponse newResourceResponse(Attributes attributes)
  {
    int _queries = attributes.getRequest().getQueryParameters().getParameterValue("queries").toInt(1);
    if (_queries < 1)
    {
      _queries = 1;
    }
    else if (_queries > 500)
    {
      _queries = 500;
    }
    final int queries = _queries;

    final ResourceResponse response = new ResourceResponse();
    response.setContentType("application/json");

    response.setWriteCallback(new WriteCallback() {
      public void writeData(Attributes attributes)
      {
        try
        {
          final ThreadLocalRandom random = ThreadLocalRandom.current();
          DataSource dataSource = WicketApplication.get().getDataSource();

          World[] worlds = new World[queries];
          try (Connection connection = dataSource.getConnection();
               PreparedStatement query = connection.prepareStatement(
                       "SELECT * FROM World WHERE id = ?",
                       ResultSet.TYPE_FORWARD_ONLY,
                       ResultSet.CONCUR_READ_ONLY);
               PreparedStatement update = connection.prepareStatement(
                       "UPDATE World SET randomNumber = ? WHERE id= ?"))
          {
            for (int i = 0; i < queries; i++)
            {
              query.setInt(1, random.nextInt(DB_ROWS) + 1);
              World world;
              try (ResultSet resultSet = query.executeQuery())
              {
                resultSet.next();
                world = new World(
                    resultSet.getInt("id"),
                    resultSet.getInt("randomNumber"));
              }
              world.randomNumber = random.nextInt(DB_ROWS) + 1;
              update.setInt(1, world.randomNumber);
              update.setInt(2, world.id);
              update.executeUpdate();
              worlds[i] = world;
            }
          }

          String data;
          if (queries == 1)
          {
              data = HelloDbUpdatesResource.mapper.writeValueAsString(worlds[0]);
          }
          else
          {
              data = HelloDbUpdatesResource.mapper.writeValueAsString(worlds);
          }
          attributes.getResponse().write(data);
        }
        catch (Exception ex)
        {
          // do nothing
        }
      }
    });
    return response;
  }
}
TOP

Related Classes of hellowicket.dbupdates.HelloDbUpdatesResource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.