【问题标题】:Is it better to do one db request and process data in application, or fetch data from db in multiple queries [closed]在应用程序中执行一个数据库请求并处理数据,还是在多个查询中从数据库中获取数据会更好[关闭]
【发布时间】:2020-09-19 09:29:32
【问题描述】:

我在数据库中保存了大约 100 个不同类型的库存,用于一个属性 有这样的代码会更好吗

List<Inventory> type1s = inventoryRepo.findByPropertyIdAndType(propertyId, Type1);
List<Inventory> type2s = inventoryRepo.findByPropertyIdAndType(propertyId, Type2);
Map<InventoryType, List<Inventory>> typeListMap = new HashMap<>();
typeListMap.put(Type1, type1s);
typeListMap.put(Type2, type2s);

List<Inventory> inventories = inventoryRepo.findByPropertyIdAndTypeIn(propertyId
        , Arrays.asList(Type1, Type2));
Map<InventoryType, List<Inventory>> typeListMap = inventories.stream().collect(
        Collectors.groupingBy(Inventory::getType, Collectors.toList()));

注意:数据库是 postgresql。 我认为第二种方法更好,遵循最小数据库调用的规则。但是我是否遗漏了其他一些需要考虑的关键方面?

【问题讨论】:

    标签: java sql postgresql java-8


    【解决方案1】:

    这些问题总是如此,答案是 - 视情况而定。

    如果要处理的数据不多,那么单次往返将是最佳选择。

    另一方面,当数据量增加时,问题就出现了:

    1. 应用程序内存可能不够,可能会抛出OutOfMemoryError

    2. 数据库可能无法响应,因为它必须处理代价高昂的查询。

    在这种情况下,批处理通常是最合理的方法。

    【讨论】:

      【解决方案2】:

      最好立即从 db 中获取数据,然后在应用程序中对其进行处理,因为如果需要扩展,最好减少数据库负载。

      【讨论】:

      • 所以你是说一次查询千兆字节的数据不会给数据库增加负载?
      • 我的意思是在应用程序中处理数据比在数据库上增加负载更好,但正如你所说,这取决于类型,所以我想你的答案非常好。
      【解决方案3】:

      在某种程度上,最快的方法是一次收集所有数据。超过这一点,建议一次将数据分成 10K 行的块。

      由您决定最好的分割点和最佳块大小。

      我想不出一次选择一行会更快的任何场景。

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 2011-02-23
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        相关资源
        最近更新 更多