2015-01-15 3 views
2

스프링 배치는 몇 가지 시퀀스 테이블을 사용하는데, MySQL의 경우에는 MyISAM 스토리지 엔진을 사용한다. 내가 직면 한 문제는 Amazon Web Services RDS 데이터베이스를 사용하고 있으며 "Point in Time"데이터베이스 복원 기능이 MyISAM 테이블이 포함 된 데이터베이스와 잘 작동하지 않는다는 것입니다.스프링 배치 MyISAM 시퀀스 테이블을 InnoDB로 옮기기

AWS RDS의 "Point in Time"데이터베이스 복원 기능을 사용하기 위해 Spring Batch MyISAM 시퀀스 테이블을 전환하고 대신 InnoDB 테이블로 대체 할 수있는 솔루션을 찾고 있습니다.

편집 :

, 여기에 순서 읽는 자바 클래스 MySQLMaxValueIncrementer에서 주석의 당 마이클의 반응 @

:

The sequence is kept in a table; there should be one sequence table per 
table that needs an auto-generated key. The table type of the sequence table 
should be MyISAM so the sequences are allocated without regard to any 
transactions that might be in progress. 

그래서 내 특정 질문에 대한 가장 간단한 방법은 무엇인지 "입니다 MyISAM 시퀀스 테이블을 삭제 "하고 Spring Batch 허밍을 유지 하시겠습니까?

+0

은 무엇입니까 단계 #에서 증가 기 공장을 사용하는 org.springframework.batch.core.repository.support.JobRepositoryFactoryBean 구성을 업데이트 너 진짜 질문이야? 당신은 스크립트를 바꿀 수 있습니다 ... –

+0

마이클, 제 질문을 확인해 주셔서 감사합니다. 테이블 정의를 변경하는 것만 큼 간단하다면 좋습니다. MySQLMaxValueIncrementer의이 주석은 그렇게 단순하지 않다고 믿게했습니다. "시퀀스는 테이블에 유지되며 자동 생성 된 키가 필요한 테이블 당 하나의 시퀀스 테이블이 있어야합니다. 시퀀스 테이블의 테이블 유형은 MyISAM이어야하므로 시퀀스가 ​​진행중인 트랜잭션과 상관없이 할당됩니다 . " – Alex

답변

1

MyISAM 시퀀스 테이블을 InnoDB로 변경하면 update...set...=last_insert_id() 문 다음에 있지만 트랜잭션이 커밋되기 전에 시퀀스 테이블에 업데이트 잠금이 생성된다는 것을 확인했습니다. 이러한 잠금은 MyISAM 시퀀스를 사용할 때 생성되지 않습니다. 따라서 "쉬운"접근 방식은 성능에 부정적인 영향을 줄 수 있습니다.

다음은 내가 생각해 낸 것입니다. 이것이 가장 쉬운 방법인지는 모르지만 작동 중입니다.

  1. this 대답 당, 기존의 시퀀스 테이블을 삭제하고 uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. 저장 프로 시저 만들기 단일 열로 다시 정의한다 : a) 인수로 시퀀스 이름을 사용을, B) 순서로 삽입을한다 , c) LAST_INSERT_ID()를 반환합니다
  3. MySQLMaxValueIncrementer을 확장하고 getNextKey() 메서드에서 저장 프로 시저를 호출하는 Java 클래스를 작성합니다. 이 작업을 수행하려면 SimpleJdbcCall 인스턴스를 사용하고 있습니다.
  4. DataFieldMaxValueIncrementerFactory를 구현하고 배치 구성에서 getIncrementer() 방법
  5. 에서 3 단계에서 인스턴스를 반환하는 자바 클래스를 작성, 4
관련 문제