Я использую Apache Shiro 1.2.3 для управления процессом входа в мое приложение.
Приложение имеет фоновый процесс, который передает данные для обработки; все работает нормально, когда приложение работает с низкой или средней загрузкой данных, но когда приложение получает большой объем данных для обработки, оно начинает использовать 100% ЦП.
Одна из проблем заключается в том, что если вы попытаетесь войти в приложение, когда это происходит, процесс входа в систему занимает 20-35 секунд (но, когда процессор свободен, он занимает всего около 0,5 секунды).
Ища внутри «конфликтующего» кода, я нашел этот код, который занимает большую часть времени процесса входа в систему:
this.getCredentialsMatcher().doCredentialsMatch(token, info)
По сути, этот код пытается выяснить, совпадает ли пароль, сохраненный в базе данных (пароль хранится в хэше с алгоритмом SHA-512 с 100 000 итераций), с паролем, введенным пользователем в форме входа в систему.
Я использую пользовательский сервис HashingPasswordService, а вот код метода паролей:
public boolean passwordsMatch(Object plaintext, Hash saved) {
ByteSource plaintextBytes = createByteSource(plaintext);
if (saved == null || saved.isEmpty()) {
return plaintextBytes == null || plaintextBytes.isEmpty();
} else {
if (plaintextBytes == null || plaintextBytes.isEmpty()) {
return false;
}
}
HashRequest request = buildHashRequest(plaintextBytes, saved);
Hash computed = this.hashService.computeHash(request);
return saved.equals(computed);
}
Есть идеи, почему процесс входа в систему занимает столько времени, когда процессор полностью работает?
Заранее спасибо!