1

Тема: Hibernate+EHCache=Тест скорости

Доброго времени суток!
   Хочу проверить как работает EHCache и для этого создал проект Hibernate с одной таблицей, в которой 5000 записей. Вроде в настройках Hibernate все прописал и разрешил кэш второго уровня (кстати что с ним по умолчанию?), и указал кэш-провайдера. В маппинге класса указал стратегию кэширования (read-only). При выполнении проекта в логе видно что идет занесение в кэш.
   Собственно, как можно проверить на сколько увеличилась скорость выполнения с включением EHCache? Пробовал тот же самый проект без EHCache... он работает быстрее.. Может у кого есть небольшой проект с EHCache чтоб можно было с ним поиграть и понять как он работает?
   На всякий вот используемые мной файлы:

HibernateUtil.java
[JAVA]package auto.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}[/JAVA]

hibernate.cfg.xml
[JAVA]<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibern … on-3.0.dtd">
<hibernate-configuration>
    <session-factory>

      <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

      <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
      <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>
      <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
      <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <property name="secondLevelCacheEnabled">true</property>
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
        <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.generate_statistics">true</property>


      <!-- Mapping files -->
        <mapping resource="auto/entity/Auto.hbm.xml"/>

    </session-factory>
</hibernate-configuration>[/JAVA]

Auto.java
[JAVA]package auto.entity;

public class Auto {

    private Long autoId;
    private String autoName;
    private String autoYear;
    private String autoProbeg;

    public Long getAutoId() {
        return autoId;
    }

    public void setAutoId(Long autoId) {
        this.autoId = autoId;
    }

    public String getAutoName() {
        return autoName;
    }

    public void setAutoName(String autoName) {
        this.autoName = autoName;
    }

    public String getAutoYear() {
        return autoYear;
    }

    public void setAutoYear(String autoYear) {
        this.autoYear = autoYear;
    }

    public String getAutoProbeg(){
        return autoProbeg;
    }

    public void setAutoProbeg(String autoProbeg){
        this.autoProbeg = autoProbeg;
    }
}[/JAVA]

Auto.hbm.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibern … ng-3.0.dtd">
<hibernate-mapping package="auto.entity">
    <class name="Auto" table="auto">
        <cache usage="read-only"/>
        <id  name="autoId" column="auto_id">
            <generator class="native"/>
        </id>
        <property name="autoName" column="auto_name"/>
        <property name="autoYear" column="auto_year"/>
        <property name="autoProbeg" column="auto_probeg"/>
    </class>
</hibernate-mapping>[/XML]

ehcache.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10"
        eternal="false"
        timeToIdleSeconds="1200"
        timeToLiveSeconds="1200"
        overflowToDisk="true"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU"/>

    <cache name="auto.entity.Auto"
        maxElementsInMemory="50000"
        eternal="false"
        timeToIdleSeconds="1200"
        timeToLiveSeconds="1200"
        overflowToDisk="true"/>
</ehcache>[/XML]

main.java
[JAVA]package auto;

import auto.entity.Auto;
import org.hibernate.Session;
import auto.utils.HibernateUtil;
import java.util.List;
import java.util.Iterator;

public class Main {

    //Добавление записи в таблицу Auto
    private void addAuto(String name, String year, String probeg){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Auto auto = new Auto();
        auto.setAutoName(name);
        auto.setAutoYear(year);
        auto.setAutoProbeg(probeg);
        session.save(auto);
        session.getTransaction().commit();
    }

    //Получение списка всех auto
    private static List<Auto> listAuto1() {
        //Long Ntime = System.currentTimeMillis();
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        //SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session.beginTransaction();
        List<Auto> autos = session.createQuery("from Auto").setMaxResults(10001).list();
        session.close();
        return autos;
    }

    //Удаление одной записи auto
    private void deleteAuto(Object auto) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.delete(auto);
        session.flush();
        session.getTransaction().commit();
    }

    public static void main(String args[])
    {
        Main main = new Main();
       
        List<Auto> autos = listAuto1();
        Iterator<Auto> iterator = autos.iterator();
        while (iterator.hasNext()) {
            Auto auto = (Auto) iterator.next();
            String str = "Машинка № " +auto.getAutoName()+". Пробег "+auto.getAutoProbeg();
        }
    }
}[/JAVA]

и кусочек лога
[ACTIONSCRIPT]
DEBUG 2010-11-09 10:23:54,208 [TwoPhaseLoad] - resolving associations for [auto.entity.Auto#484]
DEBUG 2010-11-09 10:23:54,208 [TwoPhaseLoad] - adding entity to second-level cache: [auto.entity.Auto#484]
DEBUG 2010-11-09 10:23:54,208 [ReadOnlyCache] - Caching: auto.entity.Auto#484
DEBUG 2010-11-09 10:23:54,208 [TwoPhaseLoad] - done materializing entity [auto.entity.Auto#484]
[/ACTIONSCRIPT]

   Я так понимаю кэш заполняется при первом обращении к БД, а при последующий уже из него берутся данные. Как реализовать неоднократное получение данных (сначала из БД, затем из кэша), чтобы можно было засечь время и увидеть результат?
   Всем заранее спасибо за ответы!