JDBC性能优化笔记

这部分与jdbc无关,是对于mysql优化的普通技巧

  1. 利用查询缓存。不要把函数直接写在sql语句里;
  2. 当只需要一条记录时查询加上LIMIT 1;
  3. 尽量避免SELECT *这样写;
  4. 用连接池;
  5. 建索引;

更多关于mysql的优化

 

jdbc的优化:

  1. 尽量少用元数据方法;
  2. 尽量避免null。mysql中对值为null情况花费更多的空间和处理而加重负担,应该指定专门的值来表示空值,在方法调用时传参也要避免null;
  3. 善用哑查询。在仅想得到表信息等而不需要返回记录的情况下,使用“select * from tableName where 1=0”这样的哑查询就能免于遍历;
  4. 善用预处理(PreparedStatement,PreparedCall)。PreparedStatement不但具有一次编译重复使用的优势,而且因为jdbc默认将参数以字符串形式传给数据库,而用PreparedStatement设参数则可以显式地指定数据类型,避免参数传递和来回转换的负担;
    pstmt=conn.preparedStatement("insert into test_table(......) values(....?)";
    [code="java"]pstmt.setString(1,"aaa";
    pstmt.addBatch();
    pstmt.setString(1,"bbb");
    pstmt.addBatch();
        .....
    pstmt.executeBatch();
  5. 合理选择excute方法,杀鸡就用鸡刀。execute(String sql)方法返回一个boolean值,它执行任意复杂的sql语句,可以产生多个结果集。如果有结果产生返回 true,如果没有结果集产生或仅是一个更新记数则返回 false。它产生的结果集可以通过getResultSet()和getMoreResults()获得,更新记数可通过getUpdateCount()获得。显然execute(String sql)方法的使用要复杂一些,因此如果只是简单的查询或更新操作请使用executeQuery(String sql)和executeUpdate(String sql)方法。executeUpdate(String sql)能执行INSERT,UPDATE,DELETE语句,及DDL和DML命令(此时返回值为0);
  6. 批执行更高效。stmt.addBatch(String sql); stmt.executeBatch();
  7. 最好手动提交。不但可以可以保证数据原子性,而且对新能提高留下余地
  8. try{
        boolean commitStat = connection.getAutoCommit();
        connection.setAutoCommit(false);
        // TODO: 用PreparedStatement  性能比Statementh好.
        connection.commit();
        connection.setAutoCommit(commitStat);
    } catch(SQLException e){
    } finally{
        // TODO
        if(connection!=null){
            connection.close();  
        }
    }
  9. 及时显式地关闭rs、stmt和conn(conn可以交由连接池管理);
  10. 使用数据库系统的强大查询功能去组织数据。这样程序运行是和数据库服务的交互次数少,数据库返回给程序的记录条数少的多,所以性能有很大的提高;
  11. 在rs中,正确使用get和set方法。使用列序号而不是字段名作为参数性能比较高;例如 
    getInt(1,100);
    setString(2,"aaaa");
    比
    getInt("id","100");
    setString("name","aaaa");
    性能好
    以下并不完全理解,先记着: 
  12. 建立conn时适当合适的参数。setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 两个参数可以优化连接; 
    Properties props=new Properties();
    // TODO username pwd等参数
    props.put("defaultRowPrefectch","30");
    props.put("dufaultBatchValue","5");
    
    Connection con=DriverManager.getConnection(url, props);
     
  13. 通过setFetchSize()和getFectchSize()方法来设定和查看这个参数。这个参数对体统的性能影响比较大,太小会严重地降低程序地性能.Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是:rs>stmt>conn;
  14. 适当的选择事务的隔离级别。 TRANSACTION_READ_UNCOMMITED 性能最高;TRANSACTION_READ_COMMITED 快;TRANSACTION_REFEATABLE_READ 中等;RANSACTION_SERIALIZABLE 慢
  15. 在rs优化上,设置适当的滚动方向。有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN单向滚动性能比较高;

更多:

你可能感兴趣的:(jdbc)