【问题标题】:Will database be hit 2 times by this code?数据库会被这段代码击中 2 次吗?
【发布时间】:2013-07-30 10:03:44
【问题描述】:

我正在尝试提高 api 的性能。我需要知道标记的第二行是否也会命中数据库?因为我想尽量减少。

     StringBuffer queryBuf = new StringBuffer("some query in SQL");
--------->StringBuffer queryBuf2 = new StringBuffer(" SELECT DISTINCT PP.ID FROM ( " + queryBuf + ") PP ");
        Query query1 = getSession().createSQLQuery(queryBuf2.toString());
        query1.setReadOnly(true);
        ScrollableResults results = query1.scroll();
        if (results.isLast() == false)
            results.last();
        int total = results.getRowNumber() + 1;
        results.close();
        logger.debug(">>>>>>TOTAL COUNT<<<<<< = {}", total);

【问题讨论】:

  • 该行创建了一个字符串缓冲区,就像上面的两个一样。这些都没有“命中数据库”。
  • 您的代码甚至无法编译。
  • 可以使用 Integer count= ((Long)query1.uniqueResult()).intValue();得到计数。

标签: java sql hibernate jakarta-ee scrollableresults


【解决方案1】:

你只是创建了一个字符串缓冲区。它没有击中数据库。如果我正确,这段代码可能会产生编译错误。

【讨论】:

    【解决方案2】:

    它简单明了,它不会命中,你只是在创建 StringBuffer 对象。

    【讨论】:

      【解决方案3】:

      不,它不会命中数据库。它将从第一个查询创建的缓冲区中查询。

      【讨论】:

        【解决方案4】:

        没有。只有ScrollableResults results = query1.scroll(); 行执行sql。

        另外,您可能想使用SQL COUNT

        【讨论】:

          【解决方案5】:

          我需要知道被标记的第二行是否也会命中数据库?

          您在前三行构造StringBuffer 对象,为什么要访问数据库!如果不需要同步,可以使用StringBuilder

          【讨论】:

          • 你是对的,但我不明白当“结果”取决于“query1”和“queryBuf2”上的“query1”时,如何评估“total”并显示正确的行数.
          猜你喜欢
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 1970-01-01
          • 2016-06-27
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多