java - JDBC mysql 连接在 Win8 上比 Ubuntu14 慢得多

标签 java mysql linux jdbc windows-8

我需要一些关于优化 mysql 连接/查询的帮助。老实说,我对数据库主题还很陌生,因此我不知道如何开始优化过程以及如何解释我的 linux 和 windows 机器之间的性能差异。

我有一个连接到数据库的 java 应用程序,检索一些数据(大约 1 000 000 行),处理它们并写出到一组 csv 文件。 我遇到的问题是,在我的 linux 机器(i5-2520M 和 SSD)上,整个过程大约需要 17 秒,而在我的 Windows 8 计算机(i7-4790k,SSD 磁盘与 7200 rpm HDD 相结合)上,执行几乎需要一分钟相同的代码。

因此它在 win 上的运行时间是 linux 的 3 倍多。 谁能解释为什么会这样以及如何使两个平台上的性能具有可比性?

更新 1:

我猜 JVM 是一个热点版本 8。

数据库在本地主机上。

核心:Windows 为 4x4,5 ghz,Linux 为 2x2,5 ghz,两者均采用英特尔超线程技术

在 linux 或 windows 上都没有捕获到任何异常,即使我已经为它们准备了一个 try/catch。


这里有一些关于应用程序性能和关键组件的基本数据。如有必要,我可以提供更多详细信息,请告诉我您需要什么。

    public class DBAccesor {
      private Connection mySQLconnection;
      private ResultSet answerDB;
      private Statement query;
      private final String connectionFlags = "&characterEncoding=utf8&useUnicode=true&useSSL=false"
      private String queryBody = "SELECT name, surename FROM table1 INNER JOIN table2 ON table1.person_id = table2.person_id WHERE origin = \"eu\"";
      ...
  1. 连接建立于:Win 0.167s vs Linux 0.311s

    Class.forName(driverJDBC);
    DriverManager.setLogWriter(new PrintWriter(System.out));
    mySQLconnection = DriverManager.getConnection(
                 DBServer
                 + DBName
                 + login
                 + password
                 + connectionFlags);
    
  2. 查询执行:Win 0.023 秒,Linux 0.01 秒

    query = mySQLconnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    query.setFetchSize(Integer.MIN_VALUE);
    answerDB = query.executeQuery(queryBody);
    
  3. 从结果集中检索数据:Win 53.020s vs Linux 13.282s

    ArrayList<Person> results = new ArrayList<Person>();
    while (answerDB.next()) {
      try {
        String name = new String (answerDB.getBytes(1), "UTF-8"); //since 
          //there is a lot of local characters in my data I have to use 
          //getBytes instead of getString. otherwise obtained characters are 
          //corrupted.
        String surname = new String (answerDB.getBytes(2), "UTF-8");
        results.add (new Person(name, surename));
      } catch (SQLException | UnsupportedEncodingException e) {
        e.printStackTrace();
      }
    }
    

其余代码非常简单。我有一些 paralelStream 处理基于刚刚创建的 Arraylist 并将输出写入文件。

  1. 数据处理:Win 1.109s vs Linux 2.976s
  2. 将输出写入文件:Win 1.571s vs Linux 0.439s

整体运行时间:Win 55.880s vs Linux 17.083s

最佳答案

您要做的是从 MySQL 数据库中检索数据并将这些数据写入您的磁盘。现在的问题是,这与您使用的操作系统无关。查看您的两台机器的配置,我看到您在 Linux 机器上使用 SSD,在 Windows 机器上使用 HDD。您应该知道,SSD 磁盘的读/写能力比 HDD 好得多、快得多,所以我认为这就是性能差异的来源。

我建议您阅读此讨论主题以获取更多信息: https://dba.stackexchange.com/questions/59828/ssd-vs-hdd-for-databases

关于java - JDBC mysql 连接在 Win8 上比 Ubuntu14 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34481671/

相关文章:

php - 使用 PHP 获取 mySQL 行项目 ID

java - Linux 和 Windows JDBC 时间戳精度有何差异?

java - 如何在java中将Map<String,Object>编码为String值

java Mail API接收带有越南字符的电子邮件附件

java - 在 Android 中将 EditText 输入从一个类传递到另一个类

c++ - 是否有任何标准方法可以将调试打印放入库中?

c - 32位Linux上 "_Jv_RegisterClasses"和 "clock_gettime"在哪里定义的?

java - 退出无限循环

PHP/HTML 表单向 MySQL 提供空白条目

mysql - 错误 1045 (28000) 访问被拒绝 cloudSQL