Java作为cron脚本与MySQL交互,而不是使用PHP

Java作为cron脚本与MySQL交互,而不是使用PHP,java,php,mysql,linux,cron,Java,Php,Mysql,Linux,Cron,我目前有几个Java程序,可以使用Cron读取和更新MySQL数据库 我正在考虑将代码移植到PHP。在此之前,我做了一个简单的基准测试,SELECTing某个表中的所有行,然后将值存储在字符串中 我为PHP和Java程序循环了10000次。PHP在不到5秒内运行了它。Java花了大约1分钟 我对表现上的差异感到惊讶。这是对的吗?Java真的这么慢吗?还是我做错了什么 我目前正在CentOS 5.5中使用JDK 6和PHP CLI 5.3运行cron脚本 以下是Java中的代码: import j

我目前有几个Java程序,可以使用Cron读取和更新MySQL数据库

我正在考虑将代码移植到PHP。在此之前,我做了一个简单的基准测试,
SELECT
ing某个表中的所有行,然后将值存储在字符串中

我为PHP和Java程序循环了10000次。PHP在不到5秒内运行了它。Java花了大约1分钟

我对表现上的差异感到惊讶。这是对的吗?Java真的这么慢吗?还是我做错了什么

我目前正在CentOS 5.5中使用JDK 6和PHP CLI 5.3运行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;
  }
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.Statement;
公开课考试{
私有连接=null;
私有语句=null;
公共静态void main(字符串参数[])
{
(新测试()).run();
}
私有void initDB(){
试一试{
String url=“jdbc:mysql://localhost:3306/db";
Class.forName(“org.gjt.mm.mysql.Driver”);
connection=DriverManager.getConnection(url,“用户名”、“密码”);
statement=connection.createStatement();
}捕获(例外e){
e、 printStackTrace();
}
}
私有字符串getUserProfiles()
{
String query=“从用户配置文件中选择*”;
字符串输出=”;
尝试
{
对于(int i=0;i<10000;++i)
{
ResultSet rs=语句.executeQuery(查询);
while(rs.next())
输出+=rs.getString(“名称”);
}
} 
捕获(例外e)
{
e、 printStackTrace();
}
返回输出;
}
/更多代码继续/

然后在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;
}
试试看
{
$db=newpdo(“mysql:host=localhost;dbname=db;charset=utf8”,“用户名”,“密码”);
$str=”“;
对于($i=0;$i<10000;++$i)
{
$qry=$db->prepare('SELECT*fromUserProfile;');
$qry->execute();
$result=$qry->fetchAll(PDO::FETCH_OBJ);
foreach($结果作为$profile)
{
$str.=$profile->name;
}   
}
}
捕获(PDO$e)
{
echo$e->getMessage();
出口
}

我确信这在很大程度上取决于您为每种语言编写的代码(与PHP相比,Java代码看起来像什么?)。如此大的差异表明情况有所不同。可能是您建立或维护数据库连接的方式不同?

差异可能在于您处理结果的方式。在Java版本中,您使用字符串,这意味着您将在循环中每次创建一个新副本。请尝试使用StringBuffer并附加结果,仅在完成时将其转换为字符串


看一看,讨论一下为什么字符串会这样做。

看起来您真正比较的是一种通过串联编译非常大的字符串的方法;这不是一个真正的数据库应用程序可能会做的事情,而且您没有以Java中最有效的方式来做(您在Java中使用的方式非常糟糕)

我确信,您不应该将您的语言选择建立在这个人为的、实现糟糕的基准之上


考虑哪种语言的代码更简单。我建议您使用PHP编写代码,因为从代码来看,您对Java的掌握显然较弱。

在这种情况下,您可以通过使用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();
}
私有字符串getUserProfiles()
{
String query=“从用户配置文件中选择*”;
StringBuffer输出=新的StringBuffer();
尝试
{
对于(int i=0;i<10000;++i)
{
ResultSet rs=语句.executeQuery(查询);
while(rs.next())
append(rs.getString(“name”);
}
} 
捕获(例外e)
{
e、 printStackTrace();
}
返回output.toString();
}

我真的认为我们必须看到这两个方面的代码(或者至少是示例)来了解您是如何操作的。您是否可以尝试使用
PreparedStatement
而不是
Statement
刚刚尝试使用PreparedStatement,仍然运行得很慢。。。