Использование Look up карты медленнее, чем загрузка из БД каждый раз?Как так? - PullRequest
1 голос
/ 03 мая 2019

Я столкнулся с проблемой.Прямо сейчас я вижу, что наш старый код имеет пакетную вставку.Перед этим код делает много проверок.Тем не менее, одна вещь, которую я думаю, может быть улучшена в устаревшем коде, каждый раз, когда мы пытаемся загрузить данные из БД и посмотреть, существует ли она.Я думал, что могу загрузить все данные таблицы в параллельную хэш-карту в первый раз (первый элемент), но затем просто проверить, есть ли запись на карте.Вот код

private ConcurrentMap<String, Integer> name2IdMap;

........

public Integer fetchIdByName(String name) {
        if (name2IdMap == null) {
            List<Entity> entities = dao.listAll();
            Map<String, Integer> temp = entities.stream().collect(Collectors.toMap(Entity::getName, Entity::getId));
            name2IdMap = new ConcurrentHashMap<>(temp);
        }

        return name2IdMap.get(name);
    }

Однако, когда я пытаюсь вставить 5000 строк, я заметил, что путь кеша слишком медленный, и я предполагаю, что он должен быть намного быстрее.Кто-нибудь может прокомментировать это?Спасибо

ОБНОВЛЕНИЕ: Я регистрирую время и проверил его.Карта вступает в силу.Точнее говоря, первый раз (загрузка на карту) занимает больше времени.Но после этого требуется 0 мс, чтобы найти идентификатор.Это улучшает производительность, когда у нас больше данных.Однако проблема заключается в том, что после того, как я получил это проверенное значение из кеша, и когда я пытаюсь извлечь другой объект из БД позже (тот же код), это занимает гораздо больше времени (от предыдущих 12 мс до сейчас 7 с).Код, который становится медленным:

public List<M> findByExample(M instance) {
            Criteria crit = getSession().createCriteria(getClass());
            Example example = Example.create(instance);
            crit.add(example);
            List<M> list = crit.list();
            return list;
}

При ведении журнала единственный шаг занимает слишком много времени - это list (), чего я не знаю почему.Причина, по которой способ извлечения значения из карты или базы данных ранее НЕ связан с этим кодом.Я использую MySQL.Теперь я думаю, что если есть что-то вроде того, что вы не будете часто получать БД (уровень мс), они переведут его в режим «Сон».

1 Ответ

0 голосов
/ 03 мая 2019

Пара возможных причин,

  1. Вы запускаете этот фрагмент кода на нескольких потоках ? Если нет, то производительность для ConcurrentHashMap хуже при использовании с один поток, но добавление большего количества потоков для выполнения работы определенно ускорит процесс.
  2. ConcurrentHashMap гораздо более эффективен, когда вы обрабатываете данные с сотнями и тысячами записей, а с размером 5000 ему потребуется гораздо больше внутренней работы для обработки такого меньшего набора данных.

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...