在进行简单sql查询时使用Java与PHP

在进行简单sql查询时使用Java与PHP,java,php,mysql,Java,Php,Mysql,我想知道你们中是否有人能帮我确定为什么我的简单测试应用程序会给我如此不同的结果。我制作了两个测试程序,可以进行简单的数据库查询并循环查询结果。第一个是用PHP制作的,第二个是用Java制作的 我知道Java的性能会更好,但我很难相信Java的性能会提高近20倍(见下面的结果) PHP: 爪哇: java真的那么快吗?还是我做了一些愚蠢的事情 根据消息的数量,PHP可能需要更多的内存,因为在调用fetchAll()后会保留完整的结果集 afaikphp为结果创建一个关联数组,这可能也很耗时 在PH

我想知道你们中是否有人能帮我确定为什么我的简单测试应用程序会给我如此不同的结果。我制作了两个测试程序,可以进行简单的数据库查询并循环查询结果。第一个是用PHP制作的,第二个是用Java制作的

我知道Java的性能会更好,但我很难相信Java的性能会提高近20倍(见下面的结果)

PHP:

爪哇:

java真的那么快吗?还是我做了一些愚蠢的事情

  • 根据消息的数量,PHP可能需要更多的内存,因为在调用
    fetchAll()
    后会保留完整的结果集
  • afaikphp为结果创建一个关联数组,这可能也很耗时
  • 在PHP中,您可以通过调用
    fetchAll()
    从数据库中检索所有数据,而在Java中,您只需使用
    rs.next()
    遍历结果集,而无需实际读取。根据JDBC驱动程序的实现,这可能会提供优化的机会,而这在PHP版本的实现方式中是不可能的

  • 确实没有线索,但也许java使用“st.executeQuery(查询)”进行某种结果缓存?嗯。我将createStatement()部分移动到循环中。结果有点变化。现在,它用java给出了以下结果:真实的0m13.731s用户0m44.996s sys 0m3.740sOh my bad。我没有在循环中的任何地方添加st.close()。在此之后,消耗的时间又回到了真正的0m6.542s用户0m5.852s sys 0m0.848。在循环中移动createStatement()实际上是没有用的。我只是想看看语句对象是否缓存了查询。我的理论是,如果我删除并创建新的语句对象,我最终将没有缓存。这就回答了我的部分问题:)谢谢。1.我将PHP改为使用fetch,并获得了40秒的空闲时间。现在php需要:真正的0m43.256s用户0m41.048s系统0m1.452s。2.我没有想出改变这种行为的办法。你知道吗?3.我添加了j=rs.getInt(“id”);在Java结果集处理内部。没有效果。
    $sql = "select * from message where user_id=20";
    $db = get_PDO(); 
    $stm = $db->prepare($sql);
    for($i=0;$i<10000;$i++)
    {
        echo $i."\n";
        $res = $stm->execute();
        $rows = $stm->fetchAll();
    }
    echo "done";
    
    public class Connect
    {
        public static void main (String[] args)
        {
            Connection conn = null;
            Statement st= null;
    
            try
            {
                String userName = ""; // db username
                String password = ""; // db password
                String url = "jdbc:mysql://localhost/test"; //test = db name
                Class.forName ("com.mysql.jdbc.Driver").newInstance ();
                conn = DriverManager.getConnection (url, userName, password);
                System.out.println ("Database connection established");
            }
            catch (Exception e)
            {
                System.err.println ("Cannot connect to database server: "+e.toString());
            }
            finally
            {
                if (conn != null)
                {
                    String query="select * from message where user_id=20";
    
                    try{
                        st = conn.createStatement();
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                        try{
                            conn.close();
                        }
                        catch(Exception er) {}
                        return;
                    }
    
                    for(int i=0;i<10000;i++)
                    {
                        System.out.println(i);
                        try   
                        {
                            ResultSet rs = st.executeQuery(query);
                            while(rs.next())
                            {
                            }
                        }
                        catch(Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                    try
                    {
                        conn.close ();
                        System.out.println ("Database connection terminated");
                    }
                    catch (Exception e) { /* ignore close errors */ }
                }
            }
        }
    }
    
    real    1m34.337s
    user    1m32.564s
    sys     0m0.716s
    
    real    0m5.388s
    user    0m4.428s
    sys     0m0.972s