Hello,
I'm using an ignite cluster to back an hibernate-based application. I
configured L2-cache as explained in
https://ignite.apache.org/docs/latest/extensions-and-integrations/hibernate-l2-cache
(config below)
I've ran a test reading a 1M-elements cache with a consumer counting
elements. It's very slow : more than 5 minutes to run.
Session metrics says it was the LC2 puts that takes most time (5
minutes and 3 seconds of a 5:12" operation)
INFO [2020-11-05 09:51:15,694]
org.hibernate.engine.internal.StatisticalLoggingSessionEventListener: Session
Metrics {
33350 nanoseconds spent acquiring 1 JDBC connections;
25370 nanoseconds spent releasing 1 JDBC connections;
571572 nanoseconds spent preparing 1 JDBC statements;
1153110307 nanoseconds spent executing 1 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
303191158712 nanoseconds spent performing 1000000 L2C puts;
23593547 nanoseconds spent performing 1 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
370656057 nanoseconds spent executing 1 flushes (flushing a total of
1000001 entities and 2 collections);
4684 nanoseconds spent executing 1 partial-flushes (flushing a total of 0
entities and 0 collections)
}
It seems long, event for 1M puts, but ok, let's say the L2C is
initialized now, and it will be better next time ? So I ran the query
again, but it took 5+ minutes again ...
INFO [2020-11-05 09:58:02,538]
org.hibernate.engine.internal.StatisticalLoggingSessionEventListener: Session
Metrics {
28982 nanoseconds spent acquiring 1 JDBC connections;
25974 nanoseconds spent releasing 1 JDBC connections;
52468 nanoseconds spent preparing 1 JDBC statements;
1145821128 nanoseconds spent executing 1 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
303763054228 nanoseconds spent performing 1000000 L2C puts;
1096985 nanoseconds spent performing 1 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
317558122 nanoseconds spent executing 1 flushes (flushing a total of
1000001 entities and 2 collections);
5500 nanoseconds spent executing 1 partial-flushes (flushing a total of 0
entities and 0 collections)
}
Why does the L2 cache had to be filled again ? Isn't his purpose was to
share it between Sessions ?
Actually, disabling it make the test runs in less that 6 seconds.
Why is L2C working that way ?
Regards,
******
I'm running 2.9.0 from Debian package
Hibernate properties :
hibernate.cache.use_second_level_cache: true
hibernate.generate_statistics: true
hibernate.cache.region.factory_class:
org.apache.ignite.cache.hibernate.HibernateRegionFactory
org.apache.ignite.hibernate.ignite_instance_name: ClusterWA
org.apache.ignite.hibernate.default_access_type: READ_ONLY
Method code:
@GET
@Timed
@UnitOfWork
@Path("/events/speed")
public Response getAllEvents(@Auth AuthenticatedUser auth) {
AtomicLong id = new AtomicLong();
StopWatch watch = new StopWatch();
watch.start();
evtDao.findAll().forEach(new Consumer<Event>() {
@Override
public void accept(Event t) {
long cur = id.incrementAndGet();
if (cur % 65536 == 0)
logger.debug("got element#{}", cur);
}
});
watch.stop();
return Response.ok().header("X-Count",
Long.toString(id.longValue())).entity(new Time(watch)).build();
}
Event cache config:
<bean
class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name"
value="EventCache" />
<property name="cacheMode"
value="PARTITIONED" />
<property name="atomicityMode"
value="TRANSACTIONAL" />
<property name="backups" value="1" />
<property name="readFromBackup"
value="true" />
<property name="copyOnRead"
value="true" />
<property name="dataRegionName"
value="Disk" />
<property name="keyConfiguration">
<list>
<bean
class="org.apache.ignite.cache.CacheKeyConfiguration">
<constructor-arg
value="fr.data.wa.db.ignite.EventKey" />
<constructor-arg value="clientId" />
</bean>
</list>
</property>
<property name="eagerTtl" value="true"
/>
<property name="queryEntities">
<list>
<bean
class="org.apache.ignite.cache.QueryEntity">
<property
name="keyType"
value="fr.data.wa.db.ignite.EventKey" />
<property
name="valueType"
value="fr.data.wa.db.ignite.Event" />
<property
name="tableName" value="Event" />
<property
name="keyFields">
<list>
<value>clientId</value>
<value>eventDate</value>
<value>num</value>
</list>
</property>
<property
name="fields">
<map>
<entry key="clientId" value="java.lang.Long" />
<entry key="eventDate" value="java.sql.Timestamp" />
<entry key="num" value="java.lang.Long" />
<entry key="type" value="java.lang.String" />
<entry key="source" value="java.lang.String" />
<entry key="entity" value="java.lang.String" />
<entry key="entityId" value="java.lang.Long" />
<entry key="data" value="java.lang.String" />
</map>
</property>
<property
name="aliases">
<map>
<entry key="eventDate" value="event_date" />
<entry key="clientId" value="client_id" />
<entry key="entityId" value="entity_id" />
</map>
</property>
<property
name="notNullFields">
<list>
<value>clientId</value>
<value>eventDate</value>
<value>num</value>
<value>type</value>
<value>source</value>
</list>
</property>
<property
name="indexes">
<list>
<bean class="org.apache.ignite.cache.QueryIndex">
<property name="name" value="event_pk" />
<property name="indexType" value="SORTED" />
<property name="fields">
<map>
<entry key="clientId" value="true" />
<entry key="eventDate" value="true" />
<entry key="num" value="true" />
</map>
</property>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
<bean parent="transactional-cache">
<property name="name"
value="fr.data.wa.db.hb.Event" />
</bean>
Hibernate Event entity :
package fr.data.wa.db.hb;
@Entity(name = "event")
@Table(name = "\"EventCache\".event")
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Event implements java.io.Serializable {
private static final long serialVersionUID = -3536013579696669860L;
@Id
@Column(name = "client_id", insertable = false, updatable = false)
private long clientId;
@Id
@Column(name = "event_date")
private Date eventDate;
@Id
@Column
private long num;
/* [...] */
}
--
Bastien Durel
DATA
Intégration des données de l'entreprise,
Systèmes d'information décisionnels.
[email protected]
tel : +33 (0) 1 57 19 59 28
fax : +33 (0) 1 57 19 59 73
45 avenue Carnot, 94230 CACHAN France
www.data.fr