论坛首页 Java企业应用论坛

preparedstatement与循环创建对象性能问题分析

浏览 4567 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-12  
DAO
写法一:
		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

我感觉各有己见,大家讲讲自己的看法吧
   发表时间:2008-05-12  
我会考虑用在循环体里面用
PreparedStatement.addBatch()
最后在一把调用
PreparedStatement.executeBatch()

这样一来,两全其美
0 请登录后投票
   发表时间:2008-05-13  
方法二BaseDAO.executeUpdate(String sql, List params);
内部实际就是
循环体里面用
PreparedStatement.addBatch()
最后在一把调用
PreparedStatement.executeBatch()


0 请登录后投票
   发表时间:2008-05-14  
楼上的两位说的都不错
0 请登录后投票
   发表时间:2008-05-14  
测试场景错了,现实中不会存在不改变statement那块参数的做法,在前提错了情况下作的结论是每月参考意义的。
0 请登录后投票
   发表时间:2008-05-19  
楼上哈,好好看看啊,先不说例子中的已经可以改变参数个数,你甚至可以通过sql改变参数类型,更何况只是被封装后的方法中的两个啊!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics