JDBC2.0 sql批量提交效率測(cè)試
測(cè)試環(huán)境:
springframework 1.0
數(shù)據(jù)庫(kù):Informix 9.21.FC1
表結(jié)構(gòu):
Column name Type Nulls
f1 varchar(10,0) yes
f2 varchar(10,0) yes
f3 varchar(10,0) yes
f4 varchar(10,0) yes
f5 varchar(10,0) yes
f6 varchar(10,0) yes
f7 varchar(10,0) yes
f8 varchar(10,0) yes
f9 varchar(10,0) yes
f10 varchar(10,0) yes
在f1上建立索引
測(cè)試情況:
case 1:SQL單個(gè)提交,不prepare,使用BaseDAOJdbc的executeSql方法
case 2:SQL單個(gè)提交,prepare,方法如下:
public void saveDataSinglePrepare(final List data) {
getJdbcTemplate().execute(insertData,
new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
Iterator iter = data.iterator();
while (iter.hasNext()){
Object[] objs = (Object[]) iter.next();
for(int i=0; i ps.setObject(i+1, objs[i]); } ps.execute(); } return null; } } ); } case 3:SQL批量提交,使用BaseDAOJdbc的executeBatch方法 /** * Jdbc sql的批量操作 * @param sql sql語(yǔ)句 * @param values 包含參數(shù)的List,List的每個(gè)元素是一個(gè)Object[],Object[]是一個(gè)單獨(dú)的sql操作所需的參數(shù) */ public void executeBatch(final String sql, final List values){ if (values.size() == 0) return ; getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { public void setValues(PreparedStatement ps, int i) throws SQLException { Object[] args = (Object[]) values.get(i); for(int j=0; j ///log.debug(String.valueOf(j+1)+":"+args[j].toString()); ps.setObject(j+1, args[j]); } } public int getBatchSize() { return values.size(); } } ); } case 4:SQL批量提交,使用BaseDAOJdbc的executeBatch2方法 private static final int batch_size = 100; public void executeBatch2(final String sql, final List values){ getJdbcTemplate().execute(sql, new PreparedStatementCallback() { public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { Iterator iter = values.iterator(); int sqlCount = 0; while (iter.hasNext()){ if (sqlCount >= batch_size){ ps.executeBatch(); sqlCount = 0; //log.info("executeBatch:" + sql); } Object[] args = (Object[]) iter.next(); for(int i=0; i ps.setObject(i+1, args[i]); } ps.addBatch(); sqlCount ++; log.debug("sqlCount:" + String.valueOf(sqlCount)); } if (sqlCount > 0){ ps.executeBatch(); sqlCount = 0; //log.info("executeBatch:" + sql); } return null; } } ); }