復制代碼 代碼如下:
 
package com.bao.sample.s3h4.domain; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import com.bao.sample.base.domain.BaseDomain; 
@Entity 
@Table(name = "t_user") 
public class User extends BaseDomain { 
private static final long serialVersionUID = 1L; 
private int id; 
private String username; 
private String password; 
/** 
* @Description 注解最好標記在get方法上.注意:采用一致的標記方式,注解是以Id的標記方式為準的,如果標記在get方法上,則忽略property上的注解. 
* @return 
*/ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
@Column(nullable = false) 
public String getUsername() { 
return username; 
} 
public void setUsername(String username) { 
this.username = username; 
} 
@Column(nullable = false) 
public String getPassword() { 
return password; 
} 
public void setPassword(String password) { 
this.password = password; 
} 
public User() { 
super(); 
} 
public User(int id, String username, String password) { 
super(); 
this.id = id; 
this.username = username; 
this.password = password; 
} 
} 
復制代碼 代碼如下:
 
package com.bao.sample.s3h4.dao; 
import java.util.List; 
import com.bao.sample.base.dao.BaseDao; 
import com.bao.sample.s3h4.domain.User; 
public interface UserBatchDao extends BaseDao<User> { 
/** 
* @Description 批量增加操作 
* @return -1:操作失敗;0:執行正常;>0:執行成功的數目 
*/ 
public int batchAddUsingJdbc(List<User> users); 
public int batchAddUsingHibernate(List<User> users); 
public int batchAddUsingJdbcTemplate(List<User> users); 
} 
復制代碼 代碼如下:
 
UserBatchDaoImpl 
package com.bao.sample.s3h4.dao; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.util.List; 
import javax.annotation.Resource; 
import org.hibernate.Session; 
import org.springframework.jdbc.core.BatchPreparedStatementSetter; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.orm.hibernate4.SessionFactoryUtils; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 
import com.bao.sample.base.dao.BaseDaoImpl; 
import com.bao.sample.s3h4.domain.User; 
/** 
* 
* @Description 三種批量增加方法,執行效率依次是jdbc、jdbcTemplate、hibernate.<br />jdbc和jdbcTemplate執行效率相近,不過jdbcTemplate可以使用事務注解控制,所以優先選擇. 
* @author Bob hehe198504@126.com 
* @date 2012-8-13 
*/ 
@Repository("userBatchDao") 
public class UserBatchDaoImpl extends BaseDaoImpl<User> implements UserBatchDao { 
@Resource 
protected JdbcTemplate jdbcTemplate; 
/** 
* 執行10W條記錄,大致耗時15188ms 
*/ 
@Override 
public int batchAddUsingJdbc(List<User> users) { 
int result = 0; 
Connection conn = null; 
PreparedStatement pstmt = null; 
String sql = "insert into t_user (username,password) values (?,?)"; 
try { 
conn = SessionFactoryUtils.getDataSource(sessionFactory).getConnection(); 
conn.setAutoCommit(false); 
pstmt = conn.prepareStatement(sql); 
for (int i = 0; i < users.size(); i++) { 
int j = 1; 
pstmt.setString(j++, users.get(i).getUsername()); 
pstmt.setString(j++, users.get(i).getPassword()); 
pstmt.addBatch(); 
} 
pstmt.executeBatch(); 
conn.commit(); 
conn.setAutoCommit(true); 
} catch (SQLException e) { 
if (conn != null) { 
try { 
conn.rollback(); 
} catch (SQLException e1) { 
e1.printStackTrace(); 
} 
} 
} finally { 
if (pstmt != null) { 
try { 
pstmt.close(); 
} catch (SQLException e) { 
e.printStackTrace(); 
} 
} 
if (conn != null) { 
try { 
conn.close(); 
} catch (SQLException e) { 
e.printStackTrace(); 
} 
} 
} 
return result; 
} 
/** 
* 執行10W條記錄,大致耗時131203ms,大致是jdbc或jdbcTemplate的10倍. 
*/ 
@Override 
// @Transactional(noRollbackFor = RuntimeException.class) 
@Transactional 
public int batchAddUsingHibernate(List<User> users) { 
Session session = this.getSession(); 
for (int i = 0; i < users.size(); i++) { 
session.save(users.get(i)); 
// 添加20條以后,強制入庫 
// clear()清空緩存 
// postgres數據庫的隔離級別是已提交讀(Read committed), 
// 所以flush以后,數據看不到,只有commit后才能看到數據, 
// 如果失敗,rollback,前面的flush的數據不會入庫 
if (i % 20 == 0) { 
session.flush(); 
session.clear(); 
} 
} 
return 0; 
} 
/** 
* 執行10W條記錄,大致耗時15671ms 
*/ 
// @Transactional(noRollbackFor = RuntimeException.class) 
@Transactional 
public int batchAddUsingJdbcTemplate(List<User> users) { 
String sql = "insert into t_user (username,password) values (?,?)"; 
final List<User> tempUsers = users; 
final int count = users.size(); 
BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() { 
// 為prepared statement設置參數。這個方法將在整個過程中被調用的次數 
public void setValues(PreparedStatement pstmt, int i) throws SQLException { 
int j = 1; 
pstmt.setString(j++, tempUsers.get(i).getUsername()); 
pstmt.setString(j++, tempUsers.get(i).getPassword()); 
} 
// 返回更新的結果集條數 
public int getBatchSize() { 
return count; 
} 
}; 
jdbcTemplate.batchUpdate(sql, pss); 
return 0; 
} 
public JdbcTemplate getJdbcTemplate() { 
return jdbcTemplate; 
} 
} 
新聞熱點
疑難解答