本人在最近的项目中发现这样的一个问题。在spring+ibatis的配置下,存在多种进行数据操作的方法。各种方法在效率上以及是否存在潜在bug上,也各不相同。以下述代码为例:
public void insert(SiteRank param){
getSqlMapClientTemplate().insert("insertSiteRank", param);
}
public void insertAll(List<SiteRank> siteRankList) {
for (SiteRank info : siteRankList) {
insert(info);
}
}
getSqlMapClientTemplate().insert("insertSiteRank", param);
}
public void insertAll(List<SiteRank> siteRankList) {
for (SiteRank info : siteRankList) {
insert(info);
}
}
此代码完成了一个批量的插入操作,起初看起来代码好像没有问题,也确实能完成业务上的逻辑 。
实际上每循环一次,SqlMapClientTemplate类就会产生一个PreparedStatement对象,如果数据量很大,效率不太好。
以下是解决方法:
public void insertAll(final List<SiteRank> siteRankList) {
getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor sqlmapexecutor) throws SQLException {
sqlmapexecutor.startBatch();
for(SiteRank info : siteRankList) {
sqlmapexecutor.insert("insertSiteRank", info);
}
sqlmapexecutor.executeBatch();
return null;
}
});
}
getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor sqlmapexecutor) throws SQLException {
sqlmapexecutor.startBatch();
for(SiteRank info : siteRankList) {
sqlmapexecutor.insert("insertSiteRank", info);
}
sqlmapexecutor.executeBatch();
return null;
}
});
}
此方法只产生一个PreparedStatement对象,而且在效率不错。