掲示板

Flujo de la cache transaccional

9年前 に Ignacio Lopez によって更新されました。

Flujo de la cache transaccional

New Member 投稿: 3 参加年月日: 14/12/22 最新の投稿
Buenos días,
Tengo un proyecto Liferay que quiere exportarse a Spring boot copiando algunas de las funcionalidades que aporta Liferay.
Entre dichas funcionalidades se encuentra la cache transaccional. En este proyecto usamos spymemcached de modo que un portal cache es en realidad un transactionalPortalCache que contiene un memcached.
Para mantener la sincronización entre bd y cache se está siguiendo el modelo de com.liferay.portal.spring.transaction.TransactionInterceptor, pero usando un aspecto tal que:
@Before("publicMethod() && beanAnnotatedWithTransactional() && beanInsidePackage()")
public void publicMethodInsideAClassMarkedWithTransactional()
{
if ( TransactionAspectSupport.currentTransactionStatus().isNewTransaction() )
{
TransactionSynchronizationManager.registerSynchronization(this);
TransactionalPortalCacheHelper.begin();
}
}

@Override
public void afterCompletion(int status)
{
switch (status)
{
case STATUS_COMMITTED :
TransactionalPortalCacheHelper.commit();
logger.info( "Commit!" ); break;

case STATUS_ROLLED_BACK :
TransactionalPortalCacheHelper.rollback();
logger.info( "Rollback!" ); break;

case STATUS_UNKNOWN :
logger.info( "Upps!" ); break; //TODO throw runtime exception?
}
}

El problema que nos encontramos es que hay ciertas momentos en los que la BD y la cache no permanecen sincronizados. Esto ocurre pq si añadimos un entity, hay ciertas caches que se "limpian" (por ejemplo List1 y List2 del FinderCache.
El código puede verse en cualquier persistenceImpl, nada más cerrar la sessión vemos:
finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);

if (isNew || !FooModelImpl.COLUMN_BITMASK_ENABLED) {
finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
}

Estas llamadas de clearCache acaban llegando al TransactionalPortalCache:
if (TransactionalPortalCacheHelper.isEnabled()) {
TransactionalPortalCacheHelper.removeAll(_portalCache);
}
else {
_portalCache.removeAll();
}
En nuestro caso, dado que usamos el helper, nunca elimina los datos del memcached, de modo que las siguiente llamadas a la cache son incorrectas (los datos son erroneos).

No sé que es lo que estamos haciendo mal pero imagino que no hemos entendido el flujo correctamente. Cualquier ayuda es más que bienvenida!
9年前 に Ignacio Lopez によって更新されました。

RE: Flujo de la cache transaccional

New Member 投稿: 3 参加年月日: 14/12/22 最新の投稿
Hola? Alguien lee este foro?