문제

나는 데이터베이스 응용 프로그램은 대부분을 읽지지만,하나의 테이블 레코드를 사용자는 운동에서의 큰 숫자를 가지고 씁니다.에 대한 모든 몇 천 씁니다,우리는 몇 가지 예외를 제외에서 오류 로그는 다음과 같이

[WARN][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] SQL Error: 1062, SQLState: 23000
[ERROR][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] Duplicate entry '17011' for key 1
[ERROR][2009-07-30 11:09:20,083][org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
  at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)

테이블의 문제는 다음과 같은 schema:

CREATE TABLE IF NOT EXISTS `my_table` (
  `id` int(11) NOT NULL,
  `data1` int(11) NOT NULL,
  `data2` int(11) NOT NULL,
  `timestamp` datetime default NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

와 해당하는 최대 절전 모드 매핑 XML:

<hibernate-mapping>
  <class name="mycorp.MyClass" table="my_table">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="increment"/>
    </id>
    <property name="data1" column="data1" type="java.lang.Integer"/>
    <property name="data2" column="data2" type="java.lang.Integer"/>
    <property name="timestamp" column="timestamp" type="java.util.Date"/>
  </class>
</hibernate-mapping>

그것은 가능하지만,가능성,여러 개의 인스턴스의 우리의 웹 애플리케이션 될 수 있는 데이터베이스 쓰기를 한 번에 이후,우리는 버전 번호에서 우리의 웹 애플리케이션 컨텍스트를 원활하게 릴리스의 새로운 버전의 응용 프로그램입니다.클라이언트의 이전 버전 응용 프로그램 캐시는 웹 브라우저에서는 이렇게전 버전에 액세스한 서버의는 우리는 배치 해제한 후 몇 주입니다.

어쨌든,저는 확신하지 않는 것이 문제이지만,내가 의심스러운 것이 어떤 동기화 문제는 사 MySQL 및 최대 절전 모드에서는 손으로 여기에.것 변경 내기 시퀀스,seqhilo 또는 힐로 도움이 되나요?또한,을 제공할 수 있는 경우의 예를 들어 설정 같은 발전기에서 MySQL,는 매우 도움이 될 것으로,대부분의 자원이라는 단순히 복사하고 붙여서는 비참한 최소한의 예에서는 최대 절전 모드 수동입니다.

도움이 되었습니까?

해결책

증가는 확실히 나 있는 경우 하나 이상의 프로세스에 쓰는 동일한 테이블-바 있는 충돌 사고로 이어질 수 있습니다.

이후 그것은 MySQL 우리가 얘기하는 가장 쉬운 일이 사용하는 것 identity.에서 당신의 최대 절전 모드 매핑:

<generator class="identity"/>

에서 MySQL 스크립트:

CREATE TABLE IF NOT EXISTS `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data1` int(11) NOT NULL,
  `data2` int(11) NOT NULL,
  `timestamp` datetime default NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

을 변경하는 기존의 테이블:

ALTER TABLE `my_table`
  CHANGE COLUMN `id` `id` int(11) NOT NULL AUTO_INCREMENT=$NEW_VALUE$;

어디$NEW_VALUE$로 대체해야합니다 다음 사용할 수 있는 시퀀스를 재설정하지 않습니다 1.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top