单个查询与多个查询

时间:2015-11-11 17:23:50

标签: java performance jdbc spring-data

我怀疑。我有一个不同对象的列表,在某些情况下(当 needToCheckActionCategory 为真时,我会查询数据库以验证对象的类型。这是代码:

for ( Entry<String, MyObject> tosEntry : "listOfObject".entrySet() ) {

    if ( tosEntry.getValue().getObjectType() == DHCConstants.ACTION ) {

        if ( needToCheckActionCategory > 0 ) {

            Integer entryCategory = pipelineDao.getObjectCategory(tosEntry.getKey());                   
            if ( entryCategory != actionCategory ) {
                continue;
            }

        }

        [...]

    }
}

现在我查询 needToCheckActionCategory 为true,如果对象是Action。

我的问题是:查询数据库只有一次询问所有对象的类别更好(在这种情况下,我需要创建查询并考虑&#34; listOfObject&#34;以获取所有对象ID)或仅在需要时查询数据库,但是对于单个对象?那么,回顾一个返回大对象或多个调用但又返回一个小对象的大型查询?

它是一个Web应用程序,我想优化这个部分。

2 个答案:

答案 0 :(得分:2)

首先要注意的是:如果您已将代码识别为应用程序中的性能瓶颈,则应该优化代码(另请参阅&#34;项目55:明智地优化&#34;在Effective Java by Josh Bloch中)。在单个查询中检索所有数据将使您的代码更加复杂,这就是为什么您应该只在有显着且可衡量的好处时才这样做。

据说,单个查询版本可能比执行具有不同标识符的多个查询快得多。这是因为对JDBC的每个Statement执行包括由例如由...引起的一些开销。 DB解析语句,JDBC驱动程序的结果集处理和I / O延迟。这种现象也是通过助记符逐行slow-by-slow&#34;而知道的。

答案 1 :(得分:1)

  

因此,回顾一个返回大对象或更多对象的大型查询   比一个电话,但返回一个小对象?

答案取决于您的应用程序要求。让我们考虑一个场景 假设您有多个狗品种,并且他们的ID存储在db中。现在,如果跨应用程序不同的线程非常频繁地通过其ID查询狗品种,那么将数据带入单个查询并将其存储在缓存中是有益的。如果有人要求,则从缓存中返回。它提高了时间性能,但却有内存开销。如果要支持基础结构,则可以忽略内存开销。如果数据在db中不变(它不会像服务器启动那样改变),那么你可以将缓存策略保持为read但如果它可以随时间变化,那么你应该保持read-write以便一旦在db

中修改了新数据

另一方面,用户不是经常查询,然后及时提供记录是好的,因为它会节省我们的内存开销