2

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

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

问题:

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

1 回答 1

1

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

您必须担心的一件事是内存耗尽。如果您将队列容量设置得太高并且您的作业运行时间过长,则所有作业都可能堆积在队列中占用内存。

还要考虑拒绝服务。黑客可以通过填满所有队列来执行攻击(因此拒绝真正用户的作业运行)

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

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

于 2013-06-21T04:23:57.433 回答