1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/qiujiayu-AutoLoadCache

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
warning.md 6.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 00:26 77bc1ee

Внимание:

  1. После использования @Cache параметры и возвращаемые значения соответствующего метода должны быть сериализуемыми.

Чтобы избежать изменения параметров, в AutoLoadHandler необходимо выполнить глубокое копирование параметров для последующего асинхронного обновления кеша.

  1. В параметрах следует устанавливать только необходимые значения свойств. Не рекомендуется задавать свойства, которые не используются в DAO, чтобы избежать создания различных ключей кеша и снизить частоту использования кеша. Например:
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);
    }
}
  1. Обратите внимание на ситуации, когда AOP не работает. Например:
TempDAO {

    public Object a() {
        return b().get(0);
    }

    @Cache(expire=600)
    public List<Object> b(){
        return ... ...;
    }
}

При вызове метода b через new TempDAO().a() AOP не срабатывает, и операции, связанные с кешем, также не могут быть выполнены.

  1. При автоматической загрузке кеша нельзя добавлять значения параметров запроса в метод кеширования. Например:
@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, что приведёт к увеличению значения порога.

  1. Для методов, требующих значительного времени выполнения, рекомендуется использовать автоматическую загрузку.

  2. Для запросов с резкими изменениями условий не рекомендуется использовать механизм автоматической загрузки. Например, для методов поиска данных, основанных на пользовательском вводе, не рекомендуется применять автоматическую загрузку.

  3. В методах DAO нельзя получать данные из ThreadLocal, поскольку автоматическая загрузка и асинхронное обновление кеша выполняются в другом пуле потоков, данные из ThreadLocal не будут доступны.

  4. Использование @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;
    }
}

Если транзакция завершится неудачно, данные в кеше не смогут откатиться, поэтому следует учитывать этот момент при использовании.

Как уменьшить «грязное чтение» в транзакционной среде

  1. Не извлекайте данные из кеша и не применяйте их к SQL-запросам, изменяющим данные.

  2. После завершения транзакции удалите соответствующий кеш, используя @CacheDeleteTransactional.

В большинстве случаев достаточно следовать первому пункту, так как обеспечение точности данных в базе данных является наиболее важным. «Грязное чтение» можно лишь минимизировать, но не полностью исключить. Оно может произойти только в условиях очень высокой параллельной нагрузки, подобно ситуации с билетами на поезд 12306, где система сообщает о наличии билетов, но при оплате их может не оказаться.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/qiujiayu-AutoLoadCache.git
git@api.gitlife.ru:oschina-mirror/qiujiayu-AutoLoadCache.git
oschina-mirror
qiujiayu-AutoLoadCache
qiujiayu-AutoLoadCache
master