Win8与Ubuntu14

时间:2015-12-27 15:03:33

标签: java mysql linux jdbc windows-8

我需要一些优化mysql连接/查询的帮助。老实说,我对DB主题还不熟悉,因此我不知道如何启动优化过程以及如何解释我的linux和windows机器之间的性能差异。

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

因此,胜利时间比Linux长3倍以上。任何人都可以解释为什么会这样,以及如何在两个平台上提升性能?

更新1:

JVM是我认为版本8的热点。

数据库位于localhost。

核心:用于Windows的4x4,5 ghz和用于linux的2x2,5 ghz都具有英特尔超级线程的花哨东西

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

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

    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. 建立连接:赢取 0.167s vs Linux 0.311s

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

    query = mySQLconnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    query.setFetchSize(Integer.MIN_VALUE);
    answerDB = query.executeQuery(queryBody);
    
  3. 从结果集中检索数据: 赢取 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();
      }
    }
    
  4. 其余的代码非常明确。我基于paralelStream创建了一些Arraylist处理,并将输出写入文件。

    1. 数据处理:赢取 1.109s vs Linux 2.976s
    2. 将输出写入文件: Win 1.571s vs Linux 0.439s
    3. 整体运行时间: Win 55.880s vs Linux 17.083s

1 个答案:

答案 0 :(得分:0)

您要做的是从MySQL数据库中检索数据并将此数据写入磁盘。现在的问题是,它与您使用的操作系统无关。看到两台机器的配置,我看到你在Linux上使用SSD而在Windows上使用HDD。您应该知道SSD磁盘的读/写功能比使用HDD更好更快,所以我认为从那里可以看出性能差异来自。

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