Spring @Async保存搜索

时间:2013-06-21 00:50:14

标签: java multithreading spring search

我在基于Java Spring的网站上有一个搜索输入字段,用户可以在其中搜索网站的内容。我希望将用户输入的查询异步保存到我的MySQL数据库以获得自动完成功能。我知道我可以在Spring中使用@Async注释来指定具有以下内容的池大小:

<task:annotation-driven executor="executor" />
<task:executor id="executor" pool-size="100"/> 

问题:

  • 对于每分钟超过10,000次搜索的高流量网站,这是一个很好的解决方案吗?考虑到获得池耗尽异常的可能性?
  • 有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

看看ThreadPoolTaskExecutor。当池中的所有线程都忙时,您的作业将排队,直到线程可用。可以通过queueCapacity / maxPoolSize属性调整最大队列容量和线程数(queueCapacity默认为INTEGER.MAX_VALUE)。

你需要关注的一件事就是内存耗尽。如果您将队列容量设置得太高而且作业运行时间过长,则所有作业都会在队列中堆积内存。

另请考虑拒绝服务。黑客可以通过填满所有队列来执行攻击(从而拒绝真正的用户的工作运行)

所以我说是的,这是一个很好的方法,因为你的Controller不必等到工作完成,但考虑每个排队的工作占用多少内存,你有多少内存空间,多长时间它会运行等。

好方法只是最好地猜测一些值,并设置一个好的线程池/队列监控/统计数据并随着时间的推移进行调整。