我在基于Java Spring的网站上有一个搜索输入字段,用户可以在其中搜索网站的内容。我希望将用户输入的查询异步保存到我的MySQL数据库以获得自动完成功能。我知道我可以在Spring中使用@Async注释来指定具有以下内容的池大小:
<task:annotation-driven executor="executor" />
<task:executor id="executor" pool-size="100"/>
问题:
答案 0 :(得分:1)
看看ThreadPoolTaskExecutor。当池中的所有线程都忙时,您的作业将排队,直到线程可用。可以通过queueCapacity
/ maxPoolSize
属性调整最大队列容量和线程数(queueCapacity
默认为INTEGER.MAX_VALUE)。
你需要关注的一件事就是内存耗尽。如果您将队列容量设置得太高而且作业运行时间过长,则所有作业都会在队列中堆积内存。
另请考虑拒绝服务。黑客可以通过填满所有队列来执行攻击(从而拒绝真正的用户的工作运行)
所以我说是的,这是一个很好的方法,因为你的Controller不必等到工作完成,但考虑每个排队的工作占用多少内存,你有多少内存空间,多长时间它会运行等。
好方法只是最好地猜测一些值,并设置一个好的线程池/队列监控/统计数据并随着时间的推移进行调整。