복붙노트

[SPRING] 재 연결시 시퀀스의 현재 값이 다음 100으로 넘어갑니다

SPRING

재 연결시 시퀀스의 현재 값이 다음 100으로 넘어갑니다

임베디드 데이터베이스가있는 더비 시퀀스에 문제가 있습니다. 데이터베이스에 처음 연결할 때 다음 명령문을 사용하여 다음 값이 올바른 순서로 제공됩니다.

VALUES (NEXT VALUE FOR :seqNm)

그러나 데스크톱 응용 프로그램을 다시 시작할 때 데이터베이스에 다시 연결하면 다음 값으로 다음 백 번째 값을 얻을 수 있습니다. derby가 시퀀스 번호를 사전 할당하기 위해 캐싱을 사용하는 것처럼 보입니다.

예 : 내 시퀀스가 ​​100으로 시작하면, 데이터베이스에 처음 연결하면 시퀀스가 ​​100, 101, 102 등으로 표시됩니다.

데이터베이스에 대한 두 번째 연결은 나에게 200, 201, 202, 203 등의 시퀀스를 제공합니다.

세 번째 데이터베이스에 연결하면 시퀀스가 ​​300, 301, 302, 303 등으로 나타납니다.

이 문제에 대한 해결 방법이 있습니까? 나는 스프링을 사용하여 데이터베이스에 연결하고 있습니다.

감사!!

해결법

  1. ==============================

    1.https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html에 따르면 예 preallocator가 있습니다. :)

    https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html에 따르면 예 preallocator가 있습니다. :)

    구성에서 다음을 입력하십시오.

    derby.language.sequence.preallocator=number
    

    여기서 number는 미리 할당 된 시퀀스 수입니다.

    derby.language.sequence.preallocator=className
    

    클래스 네임은 SequencePreallocator를 구현하는 클래스로 연결됩니다.

    희망이 도움이됩니다!

  2. ==============================

    2.이것이 낡은 지위라는 것을 완전히 알고 있기 때문에 나는 우연히 발견되어 우연히 받아 들여지는 대답은 가난한 대답이다.

    이것이 낡은 지위라는 것을 완전히 알고 있기 때문에 나는 우연히 발견되어 우연히 받아 들여지는 대답은 가난한 대답이다.

    예, Derby는 생성 된 인덱스 범위에 대해 사전 할당을 사용합니다. 그러나 사전 할당 크기를 단순히 낮추는 것은이 질문에 대한 좋은 대답이 아닙니다.

    OP가 DB 세션을 제대로 끝내지 못하기 때문에 실제로 문제가 발생합니다. 즉, 애플리케이션 종료시 DB에 계속 연결됩니다. 예상치 못한 종료로 인해 Derby는 할당 된 값을 누설하여 사전 할당 된 수만큼 점프를 발생시킵니다.

    설명서 (https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html)

    코드에서 Spring 사용하기 :

    dbTemplate.execute("SHUTDOWN");
    

    JDBC 사용 :

    try {
        DriverManager.getConnection("jdbc:derby:;shutdown=true");
    }
    catch (SQLException se) {
        // SQL State XJO15 and SQLCode 50000 mean an OK shutdown.
        if (!(se.getErrorCode() == 50000) && (se.getSQLState().equals("XJ015")))
                    System.err.println(se);
    }
    

    DB에 대한 연결을 올바르게 종료해도 미리 할당 된 값이 누설되지 않으며 Derby는 이전에 생성 된 값에서 계속됩니다.

    따라서 어떤 이유에서든 응용 프로그램이 종료되면 (예 : 정상 종료, 치명적인 예외 등) DB에 대한 연결을 항상 닫아야합니다.

  3. from https://stackoverflow.com/questions/21227697/sequences-current-value-advances-to-next-100-upon-reconnection-in-derby by cc-by-sa and MIT license