blob: c0a1760943a7149852542da356fe52e28a576f12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial impl
******************************************************************************/
package example;
import java.math.BigDecimal;
import java.util.List;
import java.util.Random;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import model.Customer;
import model.Order;
import model.OrderLine;
/**
* Test the performance of a mix of crud+q operations on an Order object model.
* @author James Sutherland
*/
public class Test extends PerformanceTest {
public static double INSERT = 0.2;
public static double UPDATE = 0.1;
public static double FIND = 0.4;
public static double QUERY = 0.3;
public static int SIZE = 100;
public static int ORDER_PER_CUSTOMER_SIZE = 10;
public static int ORDER_LINES_SIZE = 5;
long firstOrderId;
long firstCustomerId;
Random random = new Random();
EntityManagerFactory factory;
//Map junk = new HashMap();
public static void main(String[] args) throws Exception {
try {
Test test = new Test();
test.setup();
test.test();
} catch (Exception error) {
error.printStackTrace();
}
System.exit(0);
}
public void setup() {
/*for (int count = 0; count < 10; count++) {
junk.put(new XMLEntityMappingsMappingProject("orm", "xsd"), new XMLEntityMappingsMappingProject("orm", "xsd"));
}*/
System.out.println("Begin setup");
this.factory = Persistence.createEntityManagerFactory("benchmark");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Order order = null;
em.createQuery("Delete from OrderLine").executeUpdate();
em.createQuery("Delete from Order").executeUpdate();
em.createQuery("Delete from Customer").executeUpdate();
em.getTransaction().commit();
em.close();
em = factory.createEntityManager();
em.getTransaction().begin();
int index = 0;
int batchIndex = 0;
for (int customerIndex = 0; customerIndex < (SIZE / ORDER_PER_CUSTOMER_SIZE); customerIndex++) {
Customer customer = new Customer();
customer.setName("Customer-" + index);
em.persist(customer);
if (this.firstCustomerId == 0) {
this.firstCustomerId = customer.getId();
}
for (int orderIndex = 0; orderIndex < ORDER_PER_CUSTOMER_SIZE; orderIndex++) {
order = new Order();
order.setDescription("Order-" + index);
order.setCustomer(customer);
for (int orderLineIndex = 0; orderLineIndex < ORDER_LINES_SIZE; orderLineIndex++) {
order.addOrderLine(new OrderLine("line" + orderLineIndex, new BigDecimal(10)));
}
em.persist(order);
if (this.firstOrderId == 0) {
this.firstOrderId = order.getId();
}
index++;
}
batchIndex++;
if (batchIndex > 10) {
em.getTransaction().commit();
em.close();
em = factory.createEntityManager();
em.getTransaction().begin();
batchIndex = 0;
}
}
em.getTransaction().commit();
em.close();
}
public void test() {
System.out.println("Begin benchmark");
this.executeRun("benchmark", new Runnable() {
public void run() {
if (random.nextFloat() <= INSERT) {
runInsert(factory);
}
if (random.nextFloat() <= FIND) {
runFind(factory);
}
if (random.nextFloat() <= UPDATE) {
runUpdate(factory);
}
if (random.nextFloat() <= QUERY) {
runQuery(factory);
}
}
});
System.out.println("End benchmark");
}
public void reset() {
//this.factory.createEntityManager().unwrap(Session.class).setProfiler(new PerformanceMonitor());
}
/** Query for n orders by customer id. */
public void runQuery(EntityManagerFactory factory) {
EntityManager em = factory.createEntityManager();
Query query = em.createNamedQuery("findOrdersByCustomer");
long id = this.firstCustomerId + this.random.nextInt(SIZE/ORDER_PER_CUSTOMER_SIZE);
query.setParameter("customerId", id);
List<Order> result = query.getResultList();
for (Order order : result) {
order.getCustomer().toString();
order.getOrderLines().size();
}
em.close();
}
/** Perform a find by id. */
public void runFind(EntityManagerFactory factory) {
EntityManager em = factory.createEntityManager();
long id = this.firstOrderId + this.random.nextInt(SIZE);
Order order = em.find(Order.class, id);
order.getCustomer().toString();
order.getOrderLines().size();
em.close();
}
/** Perform an insert. */
public void runInsert(EntityManagerFactory factory) {
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Customer customer = new Customer();
customer.setName("Customer" + customer.hashCode());
em.persist(customer);
Order order = new Order();
order.setDescription("Order-" + order.hashCode());
order.setCustomer(customer);
for (int orderLineIndex = 0; orderLineIndex < ORDER_LINES_SIZE; orderLineIndex++) {
order.addOrderLine(new OrderLine("line" + orderLineIndex, new BigDecimal(10)));
}
em.persist(order);
em.getTransaction().commit();
em.close();
}
/** Perform an update. */
public void runUpdate(EntityManagerFactory factory) {
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
long id = this.firstOrderId + this.random.nextInt(SIZE);
Order order = em.find(Order.class, id);
order.getCustomer().toString();
int size = order.getOrderLines().size();
if (size > ORDER_LINES_SIZE) {
order.removeOrderLine(order.getOrderLines().get(size - 1));
} else {
order.addOrderLine(new OrderLine("line" + (size + 1), new BigDecimal(5)));
}
em.getTransaction().commit();
em.close();
}
}