簡體   English   中英

Java作為與MySQL交互的cron腳本與使用PHP

[英]Java as a cron script to interact with MySQL vs using PHP

我目前有一些使用Cron讀取和更新MySQL數據庫的Java程序。

我正在考慮將代碼移植到PHP。 在我這樣做之前,我做了一個簡單的基准測試, SELECT某個表中的所有行,然后將值存儲在字符串中。

我為PHP和Java程序循環了10,000次。 PHP在5秒內運行它。 Java花了大約1分鍾。

我對性能的差異感到驚訝。 這是對的嗎? Java真的很慢嗎? 或者我做錯了什么?

我目前正在使用JDK 6和PHP CLI 5.3在CentOS 5.5中運行cron腳本。

這是Java中的代碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {
  private Connection connection = null; 
  private Statement statement = null;

  public static void main(String args[]) 
  {
    (new Test()).run();
  }

  private void initDB() {
    try {
      String url="jdbc:mysql://localhost:3306/db";
      Class.forName( "org.gjt.mm.mysql.Driver" ); 
      connection = DriverManager.getConnection(url, "username", "password");
      statement = connection.createStatement();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private String getUserProfiles() 
  {

    String query = "SELECT * FROM UserProfile;";
    String output = "";
    try 
    {
        for(int i = 0; i < 10000; ++i)
        {
            ResultSet rs=statement.executeQuery(query);
            while(rs.next())
                output += rs.getString("name");
        }
    } 
    catch (Exception e) 
    {
      e.printStackTrace();
    }

    return output;
  }

/ 更多代碼繼續 /

然后在PHP中:

try 
{
    $db = new PDO("mysql:host=localhost;dbname=db;charset=utf8", 'username', 'password');
    $str = "";
    for($i=0; $i < 10000; ++$i)
    {
        $qry = $db->prepare('SELECT * FROM UserProfile;');

        $qry->execute();
        $result = $qry->fetchAll(PDO::FETCH_OBJ);
        foreach($result as $profile)
        {
            $str .= $profile->name;
        }   
    }
}
catch(PDOException $e)
{
    echo $e->getMessage();
    exit;
}

在這種情況下,您可以使用StringBuffer來提高java的字符串性能

private String getUserProfiles() 
{
    String query = "SELECT * FROM UserProfile;";
    StringBuffer output = new StringBuffer();
    try
    {
        for(int i =0; i < 10000; ++i)
        {
            ResultSet rs=statement.executeQuery(query);
            while(rs.next())
                output.append(rs.getString("name"));
        }
    } 
    catch (Exception e) 
    {
      e.printStackTrace();
    }
    return output.toString();
}

我確信它在很大程度上取決於你為每種語言編寫的代碼(與PHP相比,Java代碼看起來是什么樣的?)。 如此大的差異暗示了某些不同之處。 也許你建立或維護數據庫連接的方式?

差異可能在於您如何處理結果。 在Java版本中,您使用String,這意味着您每次都會在循環中創建一個新副本。 嘗試使用StringBuffer並附加結果,只在完成時將其轉換為String。

請查看http://www.velocityreviews.com/forums/t146183-why-string-is-immutable.html ,了解String為何如此行為。

看起來你真正比較的是通過連接編譯非常大的字符串的方法; 這不是真正的數據庫應用程序可能會做的事情,而且你不是在Java中以最有效的方式做這件事(你在Java中以一種可怕的方式做到這一點)。

我確信你不應該根據這個人為的和嚴重執行的基准來選擇語言。

考慮哪種語言有更簡單的代碼。 我建議你用PHP編寫它,因為從代碼中,你對Java的掌握顯然較弱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM