We are at the moment exploring caching with respect to Hibernate. The application
is a collection of stateless session beans, exposed via RMI to various webapps and
SOAP webservices. All value objects are copied into DTO's (data transfer objects)
before being sent to the client layer.
We use CMT, with JBOSS as the transaction manager/appserver and all operations are done transactionally.
We are trialling both JbossCache and Tangosol as cache providers. Initially we enabled only the 2nd-level
cache (and not the query cache), and tested standard CRUD, and everything worked fine - however while this reduced
the load on the database, we wanted to see what the next level of performance gains would
be using the query cache.
For both Tangosol and JbossCache, the cache is configured to run in full transactional mode.
Eventually we might run in a clustered fashion, however all testing has been done locally.
When the query cache was enabled, there was an obvious improvement given that there was
no round-tripping at all to the database. However, as Hibernate In Action indicates
(pg. 290 7.6.3) "Hibernate expires a cached query result set when there is any insert, update,
or delete of any row of a table that appears in the query".
And this is where it gets interesting, on updates and deletes the query cache is indeed invalidated,
however in the case of an insert, the cache is *not* invalidated and hence we continue to see
only the cached result set (until another delete/update occurs). I have verified this with both
Tangosol and JBossCache, both behave the same way, so I don't believe this is an issue with
the cache provider.
I inserted some trace log calls into the net.sf.hibernate.impl.SessionImpl, and traced it down
to around line 946 in the doSave(final Object object,Key key,final ClassPersister persister, final boolean replicate,final boolean useIdentityColumn,final Cascades.CascadingAction cascadeAction, final Object anything) method:
Code:
log.trace("finally here, last useIdentityColumn check before exec.add(insert): useIdentityColumn: " + useIdentityColumn);
if (useIdentityColumn) {
ScheduledIdentityInsertion insert = new ScheduledIdentityInsertion(values, object, persister, this);
insert.execute();
if ( insert.hasAfterTransactionCompletion() ) executions.add(insert);
log.trace("insert.hasAfterTxnComplete: " + insert.hasAfterTransactionCompletion() + ", executions.size(): " + executions.size());
id = insert.getGeneratedId();
persister.setIdentifier(object, id);
key = new Key(id, persister);
checkUniqueness(key, object);
}
insert.hasAfterTransactionComplete() is returning false, and hence the insert is not being
added to the executions list, and this is the list that is scanned to decide what
query caches need to be invalidated in the afterTransactionCompletion(boolean success) method.
I presume without better knowledge of how Hibernate exactly handles transaction demarcation
within CMT stateless session bean method calls, that because on an insert an ID needs to be
generated that this puts the doSave method call in a different running context from updates
and deletes which are simpler lightweight calls to the db - and hence are correctly flagged
as tx complete and ready for cache invalidation.
Any ideas on whether this is just a case of misconfiguration somewhere or is there a slight
logic hole when using CMT around inserts in terms of how the hook for query cache invalidation
is implemented?
Hibernate version: Hibernate 2.1.7, JBoss 3.2.6, JBossCache 1.2, Tangosol Coherence Cache 2.5 Build 290 Eval.
MySQL 4.1.7, MySQL JDBC 3.0.14production & 3.1.5gamma
Mapping documents:<?xml version="1.0"?>
StatusEvent.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="x.x.x.StatusEvent" table="StatusEvent">
<cache usage="transactional"/>
<id name="id">
<generator class="native"/>
</id>
<version name="version"/>
<property name="description"/>
<property name="realmId" />
</class>
</hibernate-mapping>
jboss-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="net.sf.hibernate.jmx.HibernateService" name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
<depends>jboss.jca:service=RARDeployer</depends>
<depends>jboss.jca:service=LocalTxCM,name=DefaultDS</depends>
<attribute name="MapResources">
x/x/x/StatusEvent.hbm.xml
</attribute>
<attribute name="JndiName">java:/hibernate/HibernateFactory</attribute>
<attribute name="Datasource">java:/DefaultDS</attribute>
<attribute name="Dialect">net.sf.hibernate.dialect.MySQLDialect</attribute>
<attribute name="TransactionStrategy">net.sf.hibernate.transaction.JTATransactionFactory</attribute>
<attribute name="TransactionManagerLookupStrategy">net.sf.hibernate.transaction.JBossTransactionManagerLookup</attribute>
<!-- <attribute name="UseOuterJoin">true</attribute> 2.1.4 -->
<attribute name="MaximumFetchDepth">3</attribute> <!-- 2.1.7c -->
<attribute name="ShowSql">false</attribute>
<attribute name="UserTransactionName">UserTransaction</attribute>
<!-- <attribute name="CacheProvider">net.sf.hibernate.cache.TreeCacheProvider</attribute> JbossCache -->
<attribute name="CacheProvider">x.x.x.x.util.TangosolCacheProvider</attribute> <!-- Tangosol Coherence Cache -->
<attribute name="QueryCacheEnabled">true</attribute> <!-- 2.1.7c -->
<!-- <attribute name="UseQueryCache">true</attribute> 2.1.4 -->
</mbean>
</server>
there is no centralised hibernate config file.
mysql ds:
<datasources>
<local-tx-datasource>
<jndi-name>DefaultDS</jndi-name>
<connection-url>jdbc:mysql://localhost/db?autoReconnect=true</connection-url>
<driver-class>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</driver-class>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<min-pool-size>5</min-pool-size>
<max-pool-size>30</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>300</idle-timeout-minutes>
<track-statements/>
<security-domain>MySqlDbRealm</security-domain>
</local-tx-datasource>
</datasources>
ejb-jar.xml
<session >
<description><![CDATA[]]></description>
<display-name>StatusEvent Services EJB</display-name>
<ejb-name>StatusEventServices</ejb-name>
<home>x.x.x.x.StatusEventServicesHome</home>
<remote>x.x.x.x.StatusEventServices</remote>
<local-home>x.x.x.x.StatusEventServicesLocalHome</local-home>
<local>x.x.x.x.StatusEventServicesLocal</local>
<ejb-class>x.x.x.x.StatusEventServicesBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<security-identity>
<use-caller-identity />
</security-identity>
</session>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Local</method-intf>
<method-name>save</method-name>
<method-params>
<method-param>x.x.x.x.StatusEventDTO</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Remote</method-intf>
<method-name>save</method-name>
<method-params>
<method-param>x.x.x.x.StatusEventDTO</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Local</method-intf>
<method-name>update</method-name>
<method-params>
<method-param>x.x.x.x.StatusEventDTO</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Remote</method-intf>
<method-name>update</method-name>
<method-params>
<method-param>x.x.x.x.StatusEventDTO</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Local</method-intf>
<method-name>findAll</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction >
<method >
<ejb-name>StatusEventServices</ejb-name>
<method-intf>Remote</method-intf>
<method-name>findAll</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
jboss server log on startup:
09:37:04,823 INFO [HibernateServiceMBean] starting service at JNDI name: java:/hibernate/HibernateF
actory
09:37:04,823 INFO [HibernateServiceMBean] service properties: {hibernate.cache.provider_class=x.x.x
.x.util.TangosolCacheProvider, hibernate.transaction.manager_lookup_class=net.sf.hiber
nate.transaction.JBossTransactionManagerLookup, hibernate.cache.use_query_cache=true, hibernate.dial
ect=net.sf.hibernate.dialect.MySQLDialect, hibernate.max_fetch_depth=3, hibernate.session_factory_na
me=java:/hibernate/HibernateFactory, hibernate.connection.datasource=java:/DefaultDS, jta.UserTransa
ction=UserTransaction, hibernate.show_sql=false, hibernate.transaction.factory_class=net.sf.hibernat
e.transaction.JTATransactionFactory}
09:37:04,863 INFO [Environment] Hibernate 2.1.7
09:37:04,863 INFO [Environment] hibernate.properties not found
09:37:04,873 INFO [Environment] using CGLIB reflection optimizer
09:37:04,873 INFO [Environment] using JDK 1.4 java.sql.Timestamp handling
09:37:04,883 INFO [Configuration] Mapping resource: x/x/x/x/StatusEvent.hbm.xml
09:37:05,094 INFO [Binder] Mapping class: x.x.x.x.StatusEvent -> StatusEvent
09:39:15,812 INFO [Configuration] processing one-to-one association property references
09:39:15,812 INFO [Configuration] processing foreign key constraints
09:39:15,912 INFO [Dialect] Using dialect: net.sf.hibernate.dialect.MySQLDialect
09:39:15,942 INFO [SettingsFactory] Maximim outer join fetch depth: 3
09:39:15,952 INFO [SettingsFactory] Use outer join fetching: true
09:39:15,972 INFO [NamingHelper] JNDI InitialContext properties:{}
09:39:15,982 INFO [DatasourceConnectionProvider] Using datasource: java:/DefaultDS
09:39:15,992 INFO [TransactionFactoryFactory] Transaction strategy: net.sf.hibernate.transaction.JT
ATransactionFactory
09:39:16,022 INFO [NamingHelper] JNDI InitialContext properties:{}
09:39:16,032 INFO [TransactionManagerLookupFactory] instantiating TransactionManagerLookup: net.sf.
hibernate.transaction.JBossTransactionManagerLookup
09:39:16,052 INFO [TransactionManagerLookupFactory] instantiated TransactionManagerLookup
09:39:16,052 INFO [NamingHelper] JNDI InitialContext properties:{}
09:39:16,062 INFO [TransactionManagerLookupFactory] instantiating TransactionManagerLookup: net.sf.
hibernate.transaction.JBossTransactionManagerLookup
09:39:16,072 INFO [TransactionManagerLookupFactory] instantiated TransactionManagerLookup
09:39:16,122 INFO [SettingsFactory] Use scrollable result sets: true
09:39:16,122 INFO [SettingsFactory] Use JDBC3 getGeneratedKeys(): true
09:39:16,122 INFO [SettingsFactory] Optimize cache for minimal puts: false
09:39:16,142 INFO [SettingsFactory] Query language substitutions: {}
09:39:16,142 INFO [SettingsFactory] cache provider: x.x.x.x.util.TangosolCacheProvide
r
09:39:16,172 INFO [SettingsFactory] query cache factory: net.sf.hibernate.cache.StandardQueryCacheF
actory
09:39:16,192 INFO [Configuration] instantiating and configuring caches
09:39:16,463 INFO [STDOUT]
******************************************************************************
*
* Tangosol Coherence(tm): Enterprise Edition is licensed by Tangosol, Inc.
* License details are available at:
http://www.tangosol.com/license.jsp*
* Licensed for evaluation use with the following restrictions:
*
* Effective Date : 15 Nov 2004 00:00:00 GMT
* Termination Date : 15 Jan 2005 00:00:00 GMT
*
* A production license is required for production use.
*
* Copyright (c) 2000-2004 Tangosol, Inc.
*
******************************************************************************
09:39:17,114 INFO [STDOUT]
Tangosol Coherence Version 2.5/290
09:39:32,786 INFO [TangosolCacheProvider] TangosolCacheProvider: buildCache: x.x.x.x.StatusEvent
09:39:33,317 INFO [SessionFactoryImpl] building session factory
09:39:38,985 INFO [SessionFactoryObjectFactory] Factory name: java:/hibernate/HibernateFactory
09:39:39,015 INFO [NamingHelper] JNDI InitialContext properties:{}
09:39:39,045 INFO [NamingHelper] Creating subcontext: hibernate
09:39:39,085 INFO [SessionFactoryObjectFactory] Bound factory to JNDI name: java:/hibernate/Hiberna
teFactory
09:39:39,145 WARN [SessionFactoryObjectFactory] InitialContext did not implement EventContext
09:39:39,185 INFO [NamingHelper] JNDI InitialContext properties:{}
09:39:39,215 INFO [UpdateTimestampsCache] starting update timestamps cache at region: net.sf.hibern
ate.cache.UpdateTimestampsCache
09:39:39,285 INFO [TangosolCacheProvider] TangosolCacheProvider: buildCache: net.sf.hibernate.cache.Up
dateTimestampsCache
09:39:39,356 INFO [StandardQueryCache] starting query cache at region: net.sf.hibernate.cache.Stand
ardQueryCache
09:39:39,426 INFO [TangosolCacheProvider] TangosolCacheProvider: buildCache: net.sf.hibernate.cache.St
andardQueryCache
Code between sessionFactory.openSession() and session.close():this is some of the CRUD methods in the DAO..
Code:
public static void save(StatusEvent event)
throws HibernateException
{
Session session = sessions.openSession();
session.save(event);
session.flush();
session.close();
}
public static void update(StatusEvent event)
throws HibernateException
{
Session session = sessions.openSession();
session.update(event);
session.flush();
session.close();
}
public static List findAll(Long realmId)
throws HibernateException
{
Session session = sessions.openSession();
try {
Query q = session.createQuery("from x.x.x.StatusEvent as n where n.realmId = :id");
q.setCacheable(true);
q.setLong("id", realmId.longValue());
return q.list();
} finally {
session.close();
}
}
Debug level Hibernate log excerpt:
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) opened session
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) saveWithGeneratedIdentifier id: null:false, short_circuit:false, idenity_column true, id
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) saveWithGeneratedIdentifier: Identity column doSave
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) saving [x.x.x.x.StatusEvent#<null>], useIdentityColumntrue
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) executing insertions
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.engine.Versioning] (RMI TCP Connection(14)-127.0.0.1:) using initial version: 0
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) finally here, last useIdentityColumn check before exec.add(insert): useIdentityColumn: true
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.persister.EntityPersister] (RMI TCP Connection(14)-127.0.0.1:) Inserting entity: x.x.x.x.StatusEvent (native id)
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.persister.EntityPersister] (RMI TCP Connection(14)-127.0.0.1:) Version: 0
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.BatcherImpl] (RMI TCP Connection(14)-127.0.0.1:) about to open: 0 open PreparedStatements, 0 open ResultSets
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.SQL] (RMI TCP Connection(14)-127.0.0.1:) insert into NetworkStatusEvent (version, description, realmId) values (?, ?, ?)
2004-12-22 14:04:18,555 725814 DEBUG [net.sf.hibernate.impl.BatcherImpl] (RMI TCP Connection(14)-127.0.0.1:) preparing statement
2004-12-22 14:04:18,565 725824 DEBUG [net.sf.hibernate.persister.EntityPersister] (RMI TCP Connection(14)-127.0.0.1:) Dehydrating entity: [x.x.x.x.StatusEvent#<null>]
2004-12-22 14:04:18,565 725824 DEBUG [net.sf.hibernate.type.IntegerType] (RMI TCP Connection(14)-127.0.0.1:) binding '0' to parameter: 1
2004-12-22 14:04:18,565 725824 DEBUG [net.sf.hibernate.type.StringType] (RMI TCP Connection(14)-127.0.0.1:) binding 'test msg 30' to parameter: 2
2004-12-22 14:04:18,565 725824 DEBUG [net.sf.hibernate.type.LongType] (RMI TCP Connection(14)-127.0.0.1:) binding '3' to parameter: 3
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.persister.AbstractEntityPersister] (RMI TCP Connection(14)-127.0.0.1:) Natively generated identity: 30
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.BatcherImpl] (RMI TCP Connection(14)-127.0.0.1:) done closing: 0 open PreparedStatements, 0 open ResultSets
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.BatcherImpl] (RMI TCP Connection(14)-127.0.0.1:) closing statement
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) insert.hasAfterTxnComplete: false, executions.size(): 0
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) flushing session
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) Flushing entities and processing referenced collections
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) Processing unreferenced collections
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) Scheduling collection removes/(re)creates/updates
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.Printer] (RMI TCP Connection(14)-127.0.0.1:) listing entities:
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.Printer] (RMI TCP Connection(14)-127.0.0.1:) x.x.x.x.StatusEvent{realmId=3, description=test msg 30, id=30, version=0}
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) executing flush
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) post flush
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) closing session
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) disconnecting session
2004-12-22 14:04:18,575 725834 DEBUG [net.sf.hibernate.engine.CacheSynchronization] (RMI TCP Connection(14)-127.0.0.1:) transaction before completion callback
2004-12-22 14:04:18,605 725864 DEBUG [net.sf.hibernate.engine.CacheSynchronization] (RMI TCP Connection(14)-127.0.0.1:) transaction after completion callback, status: 3
2004-12-22 14:04:18,605 725864 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) transaction completion
2004-12-22 14:04:18,605 725864 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) afterTransactionCompletion: execustions.size():0, invalidateQueryCache:true
.
.
.
then the retrieval of status events
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) find: from x.x.x.x.StatusEvent as n where n.realmId = :id
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.engine.QueryParameters] (RMI TCP Connection(14)-127.0.0.1:) named parameters: {id=3}
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.hql.QueryTranslator] (RMI TCP Connection(14)-127.0.0.1:) HQL: from x.x.x.x.StatusEvent as n where n.realmId = :id
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.hql.QueryTranslator] (RMI TCP Connection(14)-127.0.0.1:) SQL: select sta0_.id as id, sta0_.version as version, sta0_.description as descript3_, sta0_.realmId as Re9_ from StatusEvent sta0_ where (sta0_.realmId=? )
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.cache.StandardQueryCache] (RMI TCP Connection(14)-127.0.0.1:) checking cached query results in region: net.sf.hibernate.cache.StandardQueryCache
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.cache.StandardQueryCache] (RMI TCP Connection(14)-127.0.0.1:) Checking query spaces for up-to-dateness [[StatusEvent]]
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.cache.StandardQueryCache] (RMI TCP Connection(14)-127.0.0.1:) returning cached query results
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) loading [x.x.x.x.StatusEvent#6]
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) attempting to resolve [x.x.x.x.StatusEvent#6]
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.cache.TransactionalCache] (RMI TCP Connection(14)-127.0.0.1:) cache lookup: 6
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.cache.TransactionalCache] (RMI TCP Connection(14)-127.0.0.1:) cache hit
2004-12-22 14:04:18,855 726114 DEBUG [net.sf.hibernate.impl.SessionImpl] (RMI TCP Connection(14)-127.0.0.1:) resolved object in second-level cache [x.x.x.x.StatusEvent#6]
.
.
.
continues to load the other status events in realm 3.