2010-02-27 2 views
2

스프링에 배치 삽입과 관련된 몇 가지 질문이 있습니다. 나는 그런 일 할 때hibernateTemplate, JdbcTemplate을 사용하는 스프링 배치 삽입물

는 :

public void save(Car car) { 
    String sql1 = "insert into Car values (1, 'toyota')"; 
    String sql2 = "insert into Car values (2, 'chrysler')"; 
    String sql3 = "insert into Car values (3, 'infinity')"; 

    String[] tab = new String[2]; 
    tab[0] = sql1; 
    tab[1] = sql2; 
    tab[2] = sql3; 

    getJdbcTemplate().update(sql1); 
    getJdbcTemplate().update(sql2); 
    getJdbcTemplate().update(sql3); 

    // getJdbcTemplate().batchUpdate(tab); 
} 

MySQL의 로그 파일을 나는 참조 :

1 Query  insert into Car values (1, 'toyota') 
2 Query  insert into Car values (2, 'chrysler') 
3 Query  insert into Car values (3, 'infinity') 

그래서 우리는 3 삽입 문 (3 네트워크 호출)가 있습니다.

내가 로그 파일에 getJdbcTemplate().batchUpdate(tab)을 사용하면 내가 볼 수 있습니다

1094 [주] 디버그 org.springframework.jdbc.core.JdbcTemplate을 - 3 문 1110 [주] 디버그 조직의 SQL 일괄 업데이트를 실행. springframework.jdbc.datasource.DataSourceUtils - DataSource에서 JDBC 연결 가져 오기 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - 새 JDBC DriverManager 연결 만들기 [jdbc : mysql : // localhost : 3306/test? useServerPrepStmts = true] 1610 [main] DEBUG org.springframework.jdbc.support.JdbcUtils - JDBC 드라이버가 일괄 업데이트를 지원합니다.

와 MySQL 로그 :

1 Query  insert into Car values (1, 'toyota') 
1 Query  insert into Car values (2, 'chrysler') 
1 Query  insert into Car values (3, 'infinity') 

나는 배경 addBatch 방법에 문 객체에 호출이 모든 작업이 동시에 수행되는 것으로 알고 있습니다. 추가 혜택은 네트워크 통화 감소입니다. 내 논리가 맞습니까?

나는 HibernateTemplate에서 비슷한 것을 찾고있다. 나는이 방법으로 작업을 수행 할 수 있습니다

getHibernateTemplate().saveOrUpdateAll(Arrays.asList(new Car(4, "infinity"), new Car(5, "ford"))); 

를하는 경우, 로그 파일에 내가 볼 수 있습니다

3 Prepare  select car_.id, car_.name as name0_ from Car car_ where car_.id=? 
3 Prepare  select car_.id, car_.name as name0_ from Car car_ where car_.id=? 
3 Prepare  insert into Car (name, id) values (?, ?) 

그래서이 getJdbcTemplate에 대해 수행 한대로 모든 것이 한 번에 할 것 같다() .updateBatch (...)

내가 틀렸다면 나를 바로 잡아주세요.

답변

3

최대 절전 모드 (준비된 상태)와 비슷한 결과를 얻으려면 JdbcTemplate.batchUpdate(String, BatchPreparedStatementSetter)을 사용해야합니다. 다음과 같은 내용 :

final List<Car> cars = Arrays.asList(...); 

getJdbcTemplate().batchUpdate("insert into Car (name, id) values (?, ?);", 
    new BatchPreparedStatementSetter() { 
     private int i = 0; 
     public int getBatchSize() { return cars.size(); } 
     public void setValues(PreparedStatement ps) { 
      ps.setString(1, cars.get(i).getName()); 
      ps.setInt(2, cars.get(i).getId()); 
      i++; 
     } 
    }); 
관련 문제