JDBC数据库操作解惑

发布于 2022-09-06 15:34:18 字数 1769 浏览 18 评论 0

目前在测试JDBC数据库多线程操作,想要提高效率,无奈发现

每次运行的SQL执行时间不太一样,遍历ResultSet的时间,也不太一样

为了方便观察,我采用单线程单Session会话模拟,核心代码

try (Connection connection = DBUtils.openConnection()) {
    for (int i = 0; i < 6; i++) {
        long s = System.currentTimeMillis();
        System.out.println("准备执行SQL... ... ... ... ...");
        try (PreparedStatement preparedStatement = connection.prepareStatement(PRE_SQL + i);
             ResultSet resultSet = preparedStatement.executeQuery()) {
            long cost1 = System.currentTimeMillis() - s;
            System.out.println("执行SQL耗时:" + cost1 + "ms");
            s = System.currentTimeMillis();
            while (resultSet.next()) {
                names.add(resultSet.getString("name"));
            }
            long cost2 = System.currentTimeMillis() - s;
            System.out.println("遍历结果耗时:" + cost2 + "ms");
            System.out.println("总耗时:" + (cost1 + cost2) + "ms");
            System.out.println();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    System.out.println("集合大小为:" + names.size());
} catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}

然后结果大同小异,如下:

准备执行SQL... ... ... ... ...
执行SQL耗时:2194ms
遍历结果耗时:474ms
总耗时:2668ms

准备执行SQL... ... ... ... ...
执行SQL耗时:1934ms
遍历结果耗时:407ms
总耗时:2341ms

准备执行SQL... ... ... ... ...
执行SQL耗时:793ms
遍历结果耗时:536ms
总耗时:1329ms

准备执行SQL... ... ... ... ...
执行SQL耗时:1812ms
遍历结果耗时:395ms
总耗时:2207ms

准备执行SQL... ... ... ... ...
执行SQL耗时:810ms
遍历结果耗时:643ms
总耗时:1453ms

准备执行SQL... ... ... ... ...
执行SQL耗时:682ms
遍历结果耗时:2207ms
总耗时:2889ms

集合大小为:6000000

补充一句,有6个测试表,test_0至test_5,每个有100w测试数据。

望了解其中一二的解答下,困扰很久这个问题了,感谢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幼儿园老大 2022-09-13 15:34:18

数据库查询时间粗略地可以分为:

  1. 建立网络连接
  2. sql语句传输
  3. sql语句解析
  4. sql语句执行
  5. 数据传输
  6. 客户端数据处理等

这里(1)可能因使用连接池,使得时间不尽相同,取决于连接池的实现和参数设置, 可能某一次与其他次建立连接时间不一样; (2)基本为定值, 但也有可能在客户端进行PreparedStatement缓存而不一致; (3)同(2), 数据库会对解析进行缓存, 第一次可能和第二次不一样; (4)数据库一会对执行过的sql进行短时间缓存; (5)取决于数据量和网速, 对于同样的数据量变化不大; (6)取决于客户端代码, 但一般会小于ms级.

这里还没有考虑数据库服务器端的配置和是否有主从及负载均衡的配置等等.

所以你测试的数据是变化的很正常不过了, 需要采集大量数据,最好是与业务相似的使用场景才有价值.

好多鱼好多余 2022-09-13 15:34:18

没sql、没上下文,仅从表象上分析。

  1. 由于数据量不小,因此sql语句查询时网络传输是一个不小的开销(你可以在mysql端查看是否有write data等行为占用一定时间)
  2. 遍历结果耗时可以观察下gc的记录,另外不确定你用的集合类型,set和list的扩容方式不一样对耗时影响也不一样。6000W的集合不小了
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文