我有一个在端口上侦听 UDP 数据报的应用程序。我使用 UDP 入站通道适配器侦听此端口。我的 UDP 通道适配器配置为使用 ThreadPoolTaskExecutor 来调度传入的 UDP 数据报。在 UDP 通道适配器之后,我使用直接通道。我的频道只有一个订阅者,即服务激活者。
该服务将传入消息添加到存储在内存中的同步列表中。然后,我有一个线程每 5 秒检索一次列表的内容,并对 MySQL 数据库进行批量更新。
我的问题:
- 第一批消息到达。我的 ThreadPoolExecutor 的线程从 UDP 通道适配器获取传入消息并将它们添加到同步列表中。假设已经收到并插入了 10000 条消息。
- 后台线程检索 10000 条消息并进行批量更新 (JdbcTemplate.update(String[])。
- 此时,后台线程等待来自数据库的响应。但是,现在,由于数据库执行 10000 INSERT 需要时间,因此已收到 20000 条消息并出现在列表中。
- 后台线程接收来自数据库的响应。然后,它检索 20000 条消息并进行批量更新 (JdbcTemplate.update(String[])。
- 数据库执行 INSERT 需要更多时间,在此期间,已收到 35000 条消息并将其存储在列表中。
堆大小不断增长,并在一定时间后导致内存执行。
我正在尝试寻找解决方案来提高我的应用程序的性能。
谢谢