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