我准备在java 环境下大量使用  prepared statements  (linux java mysql 环境)
1而当前的环境是autocommit=1,  是否有必要我把 mysql 的my.cnf 配置修改 为 autocommit=0??
在java 环境下大量使用  prepared statements 是否mysql 需要做特别的配置?
2  我的当前应用复杂,全部是update delete insert 更新语句
请问到底 用prepared statements还是 statement语句好(分别如preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
resultset rs = ps.executequery(); 

Connection conn=initConnect();
Statement statement = conn.createStatement();这是很多人的观点    statement prestatement有什么区别    后者的效率比前者高,在使用PreparedStatement对象执行SQL命令时,命令被数据库进行编译和解析,然后被放到命令缓冲区.然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译.在缓冲区中可以发现预编译的命令,并且可以重新使用.    如果要你写insert update delete 最好用preparedStatement,在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能
)我当前应用是很复杂的. 2台机器每隔几分分别用socket 推送数据(发数据包)到web 服务器(java 的tomcat容器)
java程序链接mysql服务器,参照这些数据包对mysql的对应表进行数据更新 (insert新数据;  delete from a where id in (数据包里的id), update in (数据包里的id))。事实上已经确实用
PreparedStatement,但总是有人反映statement用起来实际比PreparedStatement快 ,为什么

解决方案 »

  1.   

    1而当前的环境是autocommit=1,  是否有必要我把 mysql 的my.cnf 配置修改 为 autocommit=0??你的表是什么? 如果是MYSAIM则改不改都无所谓。
    如果是INNODB的,则根据你是否需要事务而定。
      

  2.   

    2  我的当前应用复杂,全部是update delete insert 更新语句
    请问到底 用prepared statements还是 statement语句好

     statement语句好
      

  3.   

    1而当前的环境是autocommit=1, 是否有必要我把 mysql 的my.cnf 配置修改 为 autocommit=0??你的表是什么? 如果是MYSAIM则改不改都无所谓。
    如果是INNODB的,则根据你是否需要事务而定。
    ------------全部 innodb 。  用事务很少。但用到。自己的探索:Using Server-Side Prepared Statements
    • “useServerPrepStmts=true”---------------看官方手册 提示要在 my.cnf 这个加这个好
    • Less parsing - “native” on-wire format
    • Binding and Execution have compact on-wire format
    • Sketchy on early versions of MySQL-5.0
    • Type conversions can be more costly
    • Less memory pressure官方还提到
    Caching Prepared Statements
    • “cachePrepStmts=true”
    • “prepStmtCacheSize=..” and “prepStmtCacheSqlLimit=...”
    • Saves parsing cost (even more in version 5.1.8)
    • Reduces memory footprint for non-server-side statements
    • Reduces latency for server-side statements
    prepareStatement() phase新问题 
    1  是否我应该把这2个参数 都加入到my.cnf里?
    2 如何看当前的系统的这2个参数状态 ?
    mysql> show VARIABLES like '%cachePrepStmts%';
    Empty set
    mysql> show VARIABLES like '%userServerPrepStmts%';
    Empty set
    查看代码 ,发现开发人员用的是 
    jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb" + 
            "?cachePrepStmts=true", "user", "pass"); 
    f都加了cachePrepStmts=true的  ------都是在java里加的 
      

  4.   

    1、INNODB支持事务,根据表的引擎决定;
    2、PreparedStatement主要作用是上述你所说的预编译与提高了安全性(SQL语句正确性、
    按照JDBC规范的想法,实际上preparedstatement的出现主要的目的是为了提高SQL语句的的性能,
    而防止SQL注入和类型转换实际上并不是规范原本的目标)
    而不是提高速度
      

  5.   

    是否我应该把这2个参数 都加入到my.cnf里
    cachePrepStmts=true
    useServerPrepStmts=true
    (很头疼 )
      

  6.   

    这个是在mysql的jar 包里的E:\>fc mysql.gif test.gif
    Comparing files mysql.gif and TEST.GIF
    FC: no differences encounteredTest case is attached.-Xmx1024M -XX:+UseParallelGC -Dcom.mysql.jdbc.java6.javac=C:\jvms\jdk1.6.0\bin\javac.exe
    -Dcom.mysql.jdbc.java6.rtjar=C:\jvms\jdk1.6.0\jre\lib\rt.jar
    -Dcom.mysql.jdbc.testsuite.url.default=jdbc:mysql://opensol:xx/test?user=xx&password=xx&autoReconnect=false&connectTimeout=5000&socketTimeout=30000&useInformationSchema=true&useServerPrepStmts=true&useAffectedRows=false
      

  7.   

    感觉还是PreparedStatement好点,可以用来批量更新,用事务管理下就可以了 没必要该配置文件