当前位置: 首页 > 知识库问答 >
问题:

在java中批量选择和迭代mysql结果以减少等待时间

杜炫明
2023-03-14
try (Connection connection = DbConnection.getConnection()) {
    PreparedStatement preparedStatement;
    for (int x = 0; x <= listOfLocations.size() - 1; x++) {
        String query = "select diatom.species from entry" +
                " join location on location.name = entry.name" +
                " join diatom on diatom.taxonKey = entry.taxonKey" +
                " where location.name = ? AND diatom.species != \"\"";
        assert connection != null;
        preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(1, listOfLocations.get(x).getName());
        ResultSet rs = preparedStatement.executeQuery();
        HashMap<String, String> diatomHashmap = new HashMap<>();
        while (rs.next()) {
            //checks if diatom species was in the input
            //of the program to assign present/notpresent
            if (diatomArray.contains(rs.getString(1))) {
                diatomHashmap.put(rs.getString(1), "Present");
            } else if (!diatomArray.contains(rs.getString(1))) {
                diatomHashmap.put(rs.getString(1), "notPresent");
            }
            listOfLocations.get(x).setDiatoms(diatomHashmap);
        }
    }
} catch (SQLException ex) {
    System.out.println(ex);
}
return listOfLocations;

总结一下:如何打开与数据库的连接,一次执行所有查询,并迭代结果以将其读入位置对象。

共有1个答案

姬振濂
2023-03-14

您应该将其表述为where IN(...)查询

String query = "SELECT d.species " +
    "FROM entry e " +
    "INNER JOIN location l ON l.name = e.name " + 
    "INNER JOIN diatom d ON d.taxonKey = e.taxonKey " +
    "WHERE d.species != '' AND l.name IN ";

StringBuilder whereIn = new StringBuilder("(?");
for (int i=0; i < listOfLocations.size()-1; ++i) {
    whereIn.append(", ?");
}
whereIn.append(")");
query += whereIn.toString();

preparedStatement = connection.prepareStatement(query);
for (int i=1; i <= listOfLocations.size(); ++i) {
    preparedStatement.setString(i, listOfLocations.get(i-1).getName());
}

ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
    // iterate and process result set here...
}

为了明确起见,上面的代码生成了一个WHERE IN(...)子句,该子句的占位符的数量与ListofLocations列表中的位置相同。因此,假设它有5个占位符,WHERE子句应该是:

WHERE d.species != '' AND l.name IN (?, ?, ?, ?, ?)

然后我们迭代位置列表,并将每个值绑定到上面的占位符。这种方法避免了多次查询,因为现在我们只需一个查询就可以覆盖每个位置。

 类似资料:
  • 问题内容: 我有一张桌子,上面满是物品和所说物品的价格。我想获取3个最高价商品的总和。 我想也许可以,但这似乎并不能解决问题。这可能吗?谢谢! 问题答案:

  • 问题内容: 我想知道是否可以运行这样的请求: 这个想法是用t1的一些数据填充t2,但是我在语法上一定是错误的。 谢谢你的帮助 问题答案: 从语句插入时不使用关键字。

  • 我有一个带有输入框和用户界面选择下拉列表的表单,在ng-blur事件中,我调用了一个方法来自动选择所有三个用户界面选择中的选项。当我使用量角器e2e测试执行此操作时,它不会等待用户界面选择发生并提交表单,这会引发异常,因为它没有找到只有在提交包含所有必需字段的表单后才会出现的元素。我试过这样browser.wait 它正在抛出异常。

  • 我运行jmeter脚本将近一周,今天观察到一件有趣的事情。以下是场景: 概述:我正在逐渐增加应用程序的负载。在上一次测试中,我给应用程序加载了100个用户,今天我将加载增加到150个用户。 150名用户测试结果: > 与上次测试相比,请求的响应时间减少了。(这是个好兆头) 吞吐量急剧下降到上一次测试的一半,负载更少。 我的问题是: > 当我的许多请求失败时,我得到了好的响应时间吗? 注:直到100

  • 我需要修改一个现有的程序,它包含以下代码: 但这在我看来非常奇怪,首先是在select中使用和。根据斯蒂芬·克利里的回答,我应该能够放弃这些。 然后第二个,它选择结果。这是不是意味着任务根本不是异步的,而是同步执行的(这么多的努力是徒劳无功的),或者任务是异步执行的,当它完成后,查询的其余部分将被执行? 我是否应该按照Stephen Cleary的另一个答案,像下面这样编写上述代码: 而且像这样完

  • 问题内容: 我目前正在研究Java硒项目,该项目通常是一个小脚本,在该脚本中,我必须检查每个元素是否存在,并基于该操作触发了一些操作,但我们主要关心的是完成脚本的持续时间。 基本上,我在脚本中使用了下面的每个脚本并进行了测试,尽管在每种情况下脚本都在运行,但是我发现脚本执行持续时间的速度提高很少。 和它一起 要么 我知道我可以使用CSS选择器,但由于DOM Tree结构的原因,这是不可行的。什么可