我猜想:
主要原因出在你的数据库上面,mysql不是一严格意义的关系型数据库,几乎没有对事务、存储过程的支持。而PreparedStatement则是将sql变成sp再进行处理,所以反而导致了效率低下!而在一些高端的数据库上测试的话,你会得到不同的结果。

解决方案 »

  1.   

    不应该啊,
    你把测试程序列出来,看一下
    是不是,你每次插入一数据的时候生成一个PreparedStatement,
    这样的话,就错了,
    应该是生成一个PreparedStatement,然后通过传递不同的参数反复利用
      

  2.   

    PreparedStatement需要一定的系统开销,这就是慢的原因,你肯定用法不对,如果你在循环里反复生成一个PreparedStatement肯定慢,但如果你在
    生成一个PreparedStatement后将参数修改,直接在循环中使用executeQuery
    执行的话应该比Statement
      

  3.   

    Statement带代码我就不帖出来了,下面是PerparedStatement的关键代码:
    PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
    System.out.println(new java.util.Date().toString());
    for(int i=0;i<10000;i++)
    {
    stmt.clearParameters();
    stmt.setString(1,"aa");
    stmt.setString(2,"bb");
    stmt.setString(3,"cc");
    stmt.executeUpdate();
    }
    System.out.println(new java.util.Date().toString());
    我在sql server 2000下做过同样测试,效果同样让人沮丧
      

  4.   

    stmt.executeUpdate(); --> stmt.execute();试试应该有点提高。
      

  5.   

    takecare(大厅)   is right
      

  6.   

    我改成stmt.execute() 了,20-22秒左右,比单纯的Statement还是差很多,它只要5秒
      

  7.   

    问一个简单的问题:以下哪个正确?
    1、PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
    for(int i=0;i<10000;i++)
    {
    stmt.clearParameters();
    stmt.setString(i,"aa");
    stmt.executeUpdate();
    }2、PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
    for(int i=0;i<10000;i++)
    {
    stmt.clearParameters();
    stmt.setString(i,"aa");
    }
      stmt.executeUpdate();
      

  8.   

    大家见过这个错误吗?
    ORA-01008: 并非所有变量都已关联
      

  9.   

    for(int i=0;i<10000;i++)
    {
    stmt.clearParameters();
    stmt.setString(i,"aa");
    你的SQl语句只有三个参数,而你循环设置了10000个参数
      

  10.   

    to  bromon()  
    据说MS提供的SQL Server的JDBC Driver效率很低,换个第三方的试试。我用jsp测试了MySQL,driver是mysql-connector-java-2.0.14-bin.jar,代码如下:
      long start = System.currentTimeMillis();
      javax.sql.DataSource ds = (javax.sql.DataSource)JNDIRefFactory.newInstance().lookupLocalRef("java:comp/env/jdbc/testDS");
      java.sql.Connection conn = ds.getConnection();
      java.sql.PreparedStatement stmt = conn.prepareStatement("insert into test values(?,?,?)");
      System.out.println(new java.util.Date().toString());
      for(int i = 0;i < 10000;i++)
      {
        stmt.clearParameters();
        stmt.setString(1,"aa");
        stmt.setString(2,"bb");
        stmt.setString(3,"cc");
        stmt.executeUpdate();
      }
      out.println("Time: " + (System.currentTimeMillis() - start));连续测试3次,每组测试前都将原来的记录删光:
    结果:5167->4656->4236
    改用stmt.execute(),结果:5298->4536->4446改为Statement,结果:5739->4477->4396结果差不多啊!?
      

  11.   

    啊,不好意思,上面的代码有问题,应该是:
      javax.sql.DataSource ds = (javax.sql.DataSource)JNDIRefFactory.newInstance().lookupLocalRef("java:comp/env/jdbc/testDS");
      java.sql.Connection conn = ds.getConnection();
      long start = System.currentTimeMillis();
      java.sql.PreparedStatement stmt = conn.prepareStatement("insert into test values(?,?,?)");
      for(int i = 0;i < 10000;i++)
      {
        stmt.clearParameters();
        stmt.setString(1,"aa");
        stmt.setString(2,"bb");
        stmt.setString(3,"cc");
        stmt.executeUpdate();
      }
      out.println("Time: " + (System.currentTimeMillis() - start));这样才是用PreparedStatement/Statement进行insert的时间。
    不过,因为我用了ConnectionPool,所以测出来的结果还是和上一个贴子差不多的。
      

  12.   

    用一下批处理试试。for(int i = 0;i < 10000;i++)
      {
        stmt.clearParameters();
        stmt.setString(1,"aa");
        stmt.setString(2,"bb");
        stmt.setString(3,"cc");
        stmt.addBatch();
      }
    stmt.executeBatch();