У меня есть приложение, которое прослушивает порт для датаграмм UDP. Я использую адаптер входящего канала UDP для прослушивания на этом порту. Мой адаптер канала UDP настроен на использование ThreadPoolTaskExecutor для отправки входящих UDP-дейтаграмм. После адаптера канала UDP я использую прямой канал. Мой канал имеет только одного абонента, то есть активатора услуги.Улучшение производительности доступа к базе данных
Служба добавляет входящие сообщения в синхронизированный список, хранящийся в памяти. Затем у меня есть один поток, который получает содержимое списка каждые 5 секунд и выполняет пакетное обновление базы данных MySQL.
Моя проблема:
- Первая основная часть сообщения прибывает. Потоки моего ThreadPoolExecutor получают входящее сообщение от адаптера канала UDP и добавляют их в синхронизированный список. Скажем, 10000 сообщений были получены и вставлены.
- Фоновый поток извлекает 10000 сообщений и делает пакетное обновление (JdbcTemplate.update (String []).
- На данный момент, фоновый поток ожидает ответ от базы данных. Но сейчас, потому что это занимает много времени в базу данных для выполнения 10000 INSERT, были получены и присутствуют 20000 сообщений.
- Фоновый поток получает ответ от базы данных. Затем он извлекает 20000 сообщений и выполняет пакетное обновление (JdbcTemplate.update (String []).
- Для выполнения INSERT требуется больше времени для базы данных, и в течение этого времени в список было получено и сохранено 35000 сообщений.
Размер кучи постоянно растет и за определенное время вызывает нарушение памяти.
Я пытаюсь найти решение для улучшения производительности моего приложения.
Благодаря
Задать АБД настроить/перенастроить базу данных или использовать хешированный случайный файл (в конечном счете с двойным путем) в SAN (или на multi di sks configuration) –