2011-04-02 61 views
4

我目前有幾個Java程序使用Cron讀取和更新MySQL數據庫。Java作爲與MySQL交互的cron腳本vs使用PHP

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

我循環10,000次PHP和Java程序。 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; 
} 
+0

提高在這種情況下,Java的字符串表現我真的認爲我們將不得不看到兩者的代碼(或至少例子),作爲對你怎麼做。 – Joel 2011-04-02 03:35:17

+0

你可以嘗試使用'PreparedStatement'而不是'Statement' – Nishan 2011-04-02 04:41:20

+0

剛剛用PreparedStatement嘗試過,仍然運行得如此慢...... – samxli 2011-04-02 05:03:16

回答

0

我敢肯定,這將在很大程度上取決於在您爲每種語言編寫的代碼上(與PHP相比,Java代碼是什麼樣的?)。如此大的差異暗示某些事情是不同的。也許你正在建立或維護數據庫連接的方式?

0

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

我確信你不應該根據這個人爲的,執行不力的基準來選擇語言。

考慮哪種語言對您而言具有更簡單的代碼。我建議你用PHP編寫它,因爲從代碼來看,你對Java的掌握顯然比較弱。

+0

我該如何重寫基準以使其更好? – samxli 2011-04-03 03:40:25

1

您可以通過使用StringBuffer的

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(); 
}