【问题标题】:How to effectively process lot of objects on a list on server side如何有效地处理服务器端列表中的大量对象
【发布时间】:2015-10-17 10:22:53
【问题描述】:

我有一个包含很多对象的列表。 问题是我必须处理这些对象(过程包括克隆、深拷贝、进行数据库调用、运行业务逻辑等。

以正常方式执行此操作,先到先服务确实非常耗时,并且在 Web 应用程序中,这通常会导致服务器端的事务超时(因为从客户端的角度来看,此处理是 anync)。

我如何处理这些对象以便花费最少的时间而不会使数据库过载。

我在服务器环境中使用 java 7。

我已经在使用消息传递解决方案 rabbitmq,它可以为我获取商品及其数量。当我尝试对项目进行深度复制以模仿真实项目(每个项目的业务逻辑应该被唯一处理)并将它们保存到数据库时,就会出现问题。

【问题讨论】:

  • 我正在考虑使用 java 的执行器服务在多个线程中运行这个批量请求..
  • 虽然我不确定什么是克隆和深拷贝。但是,一些关键字供您思考您的解决方案:批处理、线程池、连接池
  • 如果可以做到异步,你可以使用队列和JMS
  • 在Java8中你可以考虑并行流,它比执行器简单得多。
  • 您可以在 Spring 框架中使用带有事务功能的 Spring 批处理、执行程序、调度程序,但在将数据推送到数据库之前,您必须根据您的要求和数据库的限制对值对象进行更改您要保存在数据库中的对象。如果您的要求是异步的,则所有对象都是有效的,这意味着一个项目的状态不会改变另一个项目的状态,因为上述所有解决方案都以异步方式工作。

标签: java spring jakarta-ee scalability


【解决方案1】:

经过一些讨论,可行的解决方案是使用由线程池处理的 ABQ(数组阻塞队列)。 以下是经过深思熟虑的好处:

1) 我们不必管理创建的第 3 方队列,例如兔子MQ 2) 在任何时间点,阻塞队列都不会处理所有要处理的项目,因为消费者线程将同时处理它们,因此它会留下更少的内存占用。

@cody123 在这种情况下,我使用 Spring Batch 进行重试机制。

【讨论】:

    【解决方案2】:

    经过另一轮分析后,我发现瓶颈是最大连接数较低的数据库连接池。 我通过在没有 db 线程池的情况下运行相同的事务来推断这一点,它运行得非常好,并且没有任何异常地完成。 然而,将之前的方法(即管理 ABQ 和轻提交与 HA DB)结合起来将是最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2013-09-28
      • 2016-05-04
      • 2017-01-04
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多