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