Adds a cache index test to the benchmark
diff --git a/cache/benchmark.zip b/cache/benchmark.zip
index 1e21071..2be6daa 100644
--- a/cache/benchmark.zip
+++ b/cache/benchmark.zip
Binary files differ
diff --git a/cache/src/META-INF/persistence.xml b/cache/src/META-INF/persistence.xml
index fceaccd..88efe1b 100644
--- a/cache/src/META-INF/persistence.xml
+++ b/cache/src/META-INF/persistence.xml
@@ -7,7 +7,7 @@
         <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
         <class>model.Order</class>
         <class>model.OrderLine</class>
-        <class>model.Customer</class>        
+        <class>model.Customer</class>
         <shared-cache-mode>NONE</shared-cache-mode>
         <properties>
             <!-- Change this to access your own database. -->
@@ -19,8 +19,9 @@
             <property name="javax.persistence.jdbc.url" value="jdbc:derby:test;create=true" />
             <property name="javax.persistence.jdbc.user" value="" />
             <property name="javax.persistence.jdbc.password" value="" /-->
-            <property name="eclipselink.ddl-generation" value="create-tables" />
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
             <property name="eclipselink.jdbc.cache-statements" value="true" />
+            <property name="eclipselink.jdbc.batch-writing" value="jdbc" />
             <property name="eclipselink.logging.level" value="off" />
             <property name="eclipselink.orm.validate.schema" value="true"/>
         </properties>
@@ -157,4 +158,62 @@
             <!--property name="eclipselink.logging.level" value="FINE" /-->
         </properties>
     </persistence-unit>
+    <persistence-unit name="db-query-cache" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <class>model.Order</class>
+        <class>model.OrderLine</class>
+        <class>model.Customer</class>
+        <shared-cache-mode>NONE</shared-cache-mode>
+        <mapping-file>META-INF/db-query-cache.xml</mapping-file>
+        <properties>
+            <!-- Change this to access your own database. -->
+            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
+            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:oci:@localhost:1521:orcl" />
+            <property name="javax.persistence.jdbc.user" value="scott" />
+            <property name="javax.persistence.jdbc.password" value="tiger" />
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+            <property name="eclipselink.jdbc.cache-statements" value="true" />
+            <property name="eclipselink.logging.level" value="off" />
+            <property name="eclipselink.orm.validate.schema" value="true"/>
+            <!--property name="eclipselink.logging.level" value="FINE" /-->
+        </properties>
+    </persistence-unit>
+    <persistence-unit name="database-index" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <class>model.Order</class>
+        <class>model.OrderLine</class>
+        <class>model.Customer</class>
+        <mapping-file>META-INF/database-index.xml</mapping-file>
+        <properties>
+            <!-- Change this to access your own database. -->
+            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
+            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
+            <property name="javax.persistence.jdbc.user" value="scott" />
+            <property name="javax.persistence.jdbc.password" value="tiger" />
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.jdbc.cache-statements" value="true" />
+            <property name="eclipselink.logging.level" value="off" />
+            <property name="eclipselink.orm.validate.schema" value="true"/>
+            <!--property name="eclipselink.logging.level" value="FINE" /-->
+        </properties>
+    </persistence-unit>
+    <persistence-unit name="cache-index" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+        <class>model.Order</class>
+        <class>model.OrderLine</class>
+        <class>model.Customer</class>
+        <mapping-file>META-INF/cache-index.xml</mapping-file>
+        <properties>
+            <!-- Change this to access your own database. -->
+            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
+            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:oci:@localhost:1521:orcl" />
+            <property name="javax.persistence.jdbc.user" value="scott" />
+            <property name="javax.persistence.jdbc.password" value="tiger" />
+            <property name="eclipselink.ddl-generation" value="create-tables" />
+            <property name="eclipselink.jdbc.cache-statements" value="true" />
+            <property name="eclipselink.logging.level" value="off" />
+            <property name="eclipselink.orm.validate.schema" value="true"/>
+            <!--property name="eclipselink.logging.level" value="FINE" /-->
+        </properties>
+    </persistence-unit>
 </persistence>
diff --git a/cache/src/META-INF/query-cache.xml b/cache/src/META-INF/query-cache.xml
index a876a8f..bc944f0 100644
--- a/cache/src/META-INF/query-cache.xml
+++ b/cache/src/META-INF/query-cache.xml
@@ -6,6 +6,7 @@
     <named-query name="findOrdersByCustomer">
         <query>Select o from Order o where o.customer.id = :customerId</query>
         <hint name="eclipselink.query-results-cache" value="true"/>
+        <hint name="eclipselink.query-results-cache.size" value="100000"/>
     </named-query>
 
 </entity-mappings>
diff --git a/cache/src/example/Test.java b/cache/src/example/Test.java
index 6208983..093a86e 100644
--- a/cache/src/example/Test.java
+++ b/cache/src/example/Test.java
@@ -31,7 +31,7 @@
  * @author James Sutherland
  */
 public abstract class Test extends PerformanceTest {
-    public static int SIZE = 1000;
+    public static int SIZE = 10000;
     
     long[] orderIds = new long[SIZE];
     long[] customerIds = new long[SIZE/10];
@@ -43,30 +43,12 @@
         EntityManagerFactory factory = Persistence.createEntityManagerFactory("database");
         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();
-        int index = 0;
-        for (int customerIndex = 0; customerIndex < (SIZE /10); customerIndex++) {
-            Customer customer = new Customer();
-            customer.setName("Customer-" + index);
-            em.persist(customer);
-            this.customerIds[customerIndex] = customer.getId();
-            for (int orderIndex = 0; orderIndex < 10; orderIndex++) {
-                order = new Order();
-                order.setDescription("Order-" + index);
-                order.setCustomer(customer);
-                order.addOrderLine(new OrderLine("line1", new BigDecimal(10)));
-                order.addOrderLine(new OrderLine("line2", new BigDecimal(5)));
-                order.addOrderLine(new OrderLine("line3", new BigDecimal(99)));
-                em.persist(order);
-                this.orderIds[index] = order.getId();
-                index++;
-            }
-        }
         em.getTransaction().commit();
         em.close();
+        populate(factory);
         this.factories.put("database", factory);
 
         factory = Persistence.createEntityManagerFactory("cache");
@@ -93,24 +75,61 @@
         factory.createEntityManager().close();;
         this.factories.put("query-cache", factory);
         
+        factory = Persistence.createEntityManagerFactory("db-query-cache");
+        factory.createEntityManager().close();;
+        this.factories.put("db-query-cache", factory);
+        
         factory = Persistence.createEntityManagerFactory("in-memory");
-        em = factory.createEntityManager();
+        // ** comment this persistence unit out for very large database sizes (can't load all into memory).
+        /*em = factory.createEntityManager();
         List<Order> results = em.createQuery("Select o from Order o").getResultList();
         for (Order result : results) {
             result.getCustomer().toString();
             result.getOrderLines().size();
         }
-        em.close();
+        em.close();*/
         this.factories.put("in-memory", factory);
     }
+
+    public void populate(EntityManagerFactory factory) {
+        EntityManager em = factory.createEntityManager();
+        int index = 0;
+        for (int customerIndex = 0; customerIndex < (SIZE /10); customerIndex++) {
+            em.getTransaction().begin();
+            Customer customer = new Customer();
+            customer.setName("Customer-" + customerIndex);
+            em.persist(customer);
+            this.customerIds[customerIndex] = customer.getId();
+            for (int orderIndex = 0; orderIndex < 10; orderIndex++) {
+                Order order = new Order();
+                order.setDescription("Order-" + index);
+                order.setCustomer(customer);
+                order.addOrderLine(new OrderLine("line1", new BigDecimal(10)));
+                order.addOrderLine(new OrderLine("line2", new BigDecimal(5)));
+                order.addOrderLine(new OrderLine("line3", new BigDecimal(99)));
+                em.persist(order);
+                this.orderIds[index] = order.getId();
+                index++;
+            }
+            em.getTransaction().commit();
+            em.clear();
+            System.out.println("Insert batch - " + customerIndex);
+        }
+        em.close();
+    }
     
     public void test() {
-        System.out.println("Begin benchmark");
         this.executeRun("Database", new Runnable() {
             public void run() {
                 runTest(factories.get("database"));
             }
         });
+        System.out.println("Begin benchmark");
+        this.executeRun("DBQueryCache", new Runnable() {
+            public void run() {
+                runTest(factories.get("db-query-cache"));
+            }
+        });
         this.executeRun("Cache", new Runnable() {
             public void run() {
                 runTest(factories.get("cache"));
diff --git a/cache/src/model/Customer.java b/cache/src/model/Customer.java
index c1c0e90..679ef6f 100644
--- a/cache/src/model/Customer.java
+++ b/cache/src/model/Customer.java
@@ -22,6 +22,8 @@
  */
 @Entity
 @Table(name="PERF_CUSTOMER")
+@NamedQuery(name="findCustomerByName",
+        query="Select c from Customer c where c.name = :name")
 public class Customer implements Serializable {
     @Id
     @GeneratedValue(strategy=GenerationType.TABLE)
diff --git a/cache/src/model/Order.java b/cache/src/model/Order.java
index e880d47..1abbbd5 100644
--- a/cache/src/model/Order.java
+++ b/cache/src/model/Order.java
@@ -25,10 +25,9 @@
  */
 @Entity(name="Order")
 @Table(name="PERF_ORDER")
-@NamedQueries({
-    @NamedQuery(name="findOrdersByCustomer",
+@NamedQuery(name="findOrdersByCustomer",
             query="Select o from Order o where o.customer.id = :customerId")
-})
+@org.eclipse.persistence.annotations.Index(columnNames="CUSTOMER_ID")
 public class Order implements Serializable {
     @Id
     @GeneratedValue(strategy=GenerationType.TABLE)