案例说明
本案例我们希望使用三种方式查询数据库某张表下所有数据:
- 单线程+分页查询获取所有数据
- 单线程+直接查询获取所有数据
- 多线程+分页查询获取所有数据
测试结论
在比较这三种方式的效率时,我们需要考虑几个关键因素:数据量的大小、查询操作的复杂性、以及并行处理的能力。
首先,我们来看 list() 方法。这个方法直接调用 deviceTestOneService.list() 来获取表中的所有数据。如果数据量非常大,那么这种方法可能会导致内存溢出,因为它会一次性加载所有数据到内存中。此外,由于它是同步执行的,没有利用并行处理的能力,所以在处理大量数据时可能会比较慢。
接下来是 getPageAll() 方法。这个方法采用了分页查询的方式,每次只获取一部分数据,从而避免了内存溢出的问题。然而,它也是同步执行的,没有利用多线程或并行处理的能力。如果每次分页查询的数据量仍然很大,或者需要查询的轮数很多,那么这种方法的效率可能仍然会受到限制。
最后是 multithreading() 方法。这个方法利用了多线程并行处理的能力,将查询任务分配给多个线程同时执行。这样,可以同时从数据库中获取多个数据块,从而提高了整体的查询效率。当然,多线程也带来了一定的复杂性和开销,比如线程创建、管理和同步等。但是,在数据量较大且服务器资源足够的情况下,多线程方法通常能够显著提高查询效率。
综上所述,从效率角度来看,我们可以将这三种方式按以下顺序排序(从高到低):
- multithreading():利用多线程并行处理,能够同时执行多个查询任务,提高了整体的查询效率。
- getPageAll():采用分页查询的方式,避免了内存溢出的问题,但仍然是同步执行的。
- list():直接加载所有数据到内存中,可能导致内存溢出,且没有利用并行处理的能力,效率较低。
需要注意的是,这个排序是基于一般情况下的假设。在实际应用中,效率还受到其他因素的影响,如数据库的性能、网络延迟、服务器资源等。因此,在选择使用哪种方式时,还需要根据具体的场景和需求进行评估和测试。
Controller层核心代码
package com.interviewbar.system.controller;
import com.interviewbar.common.vo.Result;
import com.interviewbar.system.entity.DeviceTestOne;
import com.interviewbar.system.service.DeviceTestOneService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* @author FangGL
*/
@RestController
@RequestMapping("/deviceTestOne")
public class DeviceTestOneController {
private final DeviceTestOneService deviceTestOneService;
public DeviceTestOneController(DeviceTestOneService deviceTestOneService) {
this.deviceTestOneService = deviceTestOneService;
}
/**
* 查询表中所有数据
* @return
*/
@GetMapping("/list"

文章分析了单线程、分页查询和多线程并行处理在查询大量数据时的效率,发现多线程并行查询在处理大数据时效率最高,而单线程直接加载可能导致内存溢出。作者提供了Controller层核心代码示例和测试报告结果。
401

被折叠的 条评论
为什么被折叠?



