preparedstatement与循环创建对象性能问题分析写法一:Object[] cocodeParams new Object[2]Object[] da
preparedstatement与循环创建对象性能问题分析
写法一:Object[] cocodeParams = new Object[2];Object[] dataParams = new Object[3];for(int i=0;i<n;i++){cocodeParams[0]="0";cocodeParams[1]="1";BaseDAO.executeUpdate(sql, cocodeParams);dataParams[0]="A";dataParams[1]="B";dataParams[2]="C";BaseDAO.executeUpdate(sql, dataParams);-----------------------------------------写法二:List cocodeList=new ArrayList();List dataList=new ArrayList();Object[] cocodeParams = null;Object[] dataParams = null;for(int i=0;i<n;i++){cocodeParams = new Object[2];cocodeParams[0]="0";cocodeParams[1]="1";cocodeList.add(cocodeParams);dataParams = new Object[3];dataParams[0]="A";dataParams[1]="B";dataParams[2]="C";dataList.add(dataParams);}BaseDAO.batchUpdate(sql, cocodeList);BaseDAO.batchUpdate(sql, dataList);}
1.BaseDAO是一个封装jdbc的工具类
2.BaseDAO.batchUpdate(String sql, Object[] params);
如:sql = "update employee set name = ? ,code = ? , age = ? "
Object[] params = new Object[3];params[0]="A"; params[1]="B";params[2]="C";
通过执行BaseDAO.batchUpdate(String sql, Object[] params)
达到update employee set name = 'A' ,code = 'B', age = 'C'的目的
通过Statement实现,传入sql语句和要设定的值(Object[])
3.BaseDAO.executeUpdate(String sql, List params);
如:sql = "update employee set name = ? ,code = ? , age = ? "
Object[] params1 = new Object[3];params[0]="A"; params[1]="B";params[2]="C";
Object[] params2 = new Object[3];params[0]="B"; params[1]="C";params[2]="D";
params.add(params1);params.add(params2);
通过执行BaseDAO.batchUpdate(String sql, Object[] params)
达到update employee set name = 'A' ,code = 'B', age = 'C';update employee set name = 'B' ,code = 'C', age = 'D'的目的
通过PreparedStatement实现,传入同构的sql语句和要设定的值(LIST)
在上面的两种情况中
写法一用了BaseDAO.batchUpdate(String sql, Object[] params);
写法二用了BaseDAO.executeUpdate(String sql, List params);
既然写法二用了List,那么add的时候就不能增加同一对象,必须创建新对象(否则,所有的都是相同的)
写法一,创建了cocodeParams和dataParams两个对象
写法一,创建了2*n个对象
现在的效率应该怎么分析呢?
写法一,少创建了对象,但用了statement
写法二,多创建了对象,但用了preparedstatement
我感觉各有己见,大家讲讲自己的看法吧 1 楼 armorking 2008-05-12 我会考虑用在循环体里面用
PreparedStatement.addBatch()
最后在一把调用
PreparedStatement.executeBatch()
这样一来,两全其美
2 楼 karlpan01 2008-05-13 方法二BaseDAO.executeUpdate(String sql, List params);
内部实际就是
循环体里面用
PreparedStatement.addBatch()
最后在一把调用
PreparedStatement.executeBatch()
3 楼 chbest 2008-05-14 楼上的两位说的都不错 4 楼 XMLDB 2008-05-14 测试场景错了,现实中不会存在不改变statement那块参数的做法,在前提错了情况下作的结论是每月参考意义的。 5 楼 karlpan01 2008-05-19 楼上哈,好好看看啊,先不说例子中的已经可以改变参数个数,你甚至可以通过sql改变参数类型,更何况只是被封装后的方法中的两个啊!