Внимание:
Чтобы избежать изменения параметров, в AutoLoadHandler необходимо выполнить глубокое копирование параметров для последующего асинхронного обновления кеша.
public CollectionTO<AccountTO> getAccountByCriteria(AccountCriteriaTO criteria) {
List<AccountTO> list=null;
PaginationTO paging=criteria.getPaging();
if(null != paging && paging.getPageNo() > 0 && paging.getPageSize() > 0) {// Если требуется постраничный запрос, сначала запросите общее количество
criteria.setPaging(null);// Уменьшите изменение ключа кеша, при запросе общего количества данных не устанавливайте атрибуты, связанные с разбиением на страницы
Integer recordCnt=accountDAO.getAccountCntByCriteria(criteria);
if(recordCnt > 0) {
criteria.setPaging(paging);
paging.setRecordCnt(recordCnt);
list=accountDAO.getAccountByCriteria(criteria);
}
return new CollectionTO<AccountTO>(list, recordCnt, criteria.getPaging().getPageSize());
} else {
list=accountDAO.getAccountByCriteria(criteria);
return new CollectionTO<AccountTO>(list, null != list ? list.size() : 0, 0);
}
}
TempDAO {
public Object a() {
return b().get(0);
}
@Cache(expire=600)
public List<Object> b(){
return ... ...;
}
}
При вызове метода b через new TempDAO().a() AOP не срабатывает, и операции, связанные с кешем, также не могут быть выполнены.
@Cache(expire=600, autoload=true, key="'myKey'+#hash(#args[0])")
public List<AccountTO> getDistinctAccountByPlayerGet(AccountCriteriaTO criteria) {
List<AccountTO> list;
int count=criteria.getPaging().getThreshold() ;
// Запрашиваем в 10 раз больше заданного количества
criteria.getPaging().setThreshold(count * 10);
… …
}
Поскольку при автоматической загрузке AutoLoadHandler кэширует параметры запроса, каждый раз при выполнении порог будет умножаться на 10, что приведёт к увеличению значения порога.
Для методов, требующих значительного времени выполнения, рекомендуется использовать автоматическую загрузку.
Для запросов с резкими изменениями условий не рекомендуется использовать механизм автоматической загрузки. Например, для методов поиска данных, основанных на пользовательском вводе, не рекомендуется применять автоматическую загрузку.
В методах DAO нельзя получать данные из ThreadLocal, поскольку автоматическая загрузка и асинхронное обновление кеша выполняются в другом пуле потоков, данные из ThreadLocal не будут доступны.
Использование @Cache(opType=CacheOpType.WRITE) может привести к проблемам. Поскольку AutoloadCache не поддерживает откат транзакций, в следующих ситуациях данные в кеше могут оказаться некорректными:
public class UserDAO {
// Обновляем данные и одновременно добавляем их в кеш
@Cache(expire=600, key="'user'+#retVal.id", opType=CacheOpType.WRITE)
public UserTO updateUser(UserTO user) {
getSqlMapClient().update("USER.updateUser", user);
return user;
}
}
Если транзакция завершится неудачно, данные в кеше не смогут откатиться, поэтому следует учитывать этот момент при использовании.
Не извлекайте данные из кеша и не применяйте их к SQL-запросам, изменяющим данные.
После завершения транзакции удалите соответствующий кеш, используя @CacheDeleteTransactional.
В большинстве случаев достаточно следовать первому пункту, так как обеспечение точности данных в базе данных является наиболее важным. «Грязное чтение» можно лишь минимизировать, но не полностью исключить. Оно может произойти только в условиях очень высокой параллельной нагрузки, подобно ситуации с билетами на поезд 12306, где система сообщает о наличии билетов, но при оплате их может не оказаться.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )