diff --git a/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java b/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java index 44f20e643..703fa7958 100644 --- a/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java +++ b/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java @@ -12,9 +12,10 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.NavigableSet; +import java.util.TreeSet; /** * Database sequence based IdGenerator. @@ -42,7 +43,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator { protected final BackgroundExecutor backgroundExecutor; - protected final ArrayList idList = new ArrayList<>(50); + protected final NavigableSet idList = new TreeSet<>(); protected final int allocationSize; @@ -97,15 +98,13 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator { @Override public Object nextId(Transaction t) { synchronized (monitor) { - int size = idList.size(); if (size > 0) { maybeLoadMoreInBackground(size); } else { loadMore(allocationSize); } - - return idList.remove(0); + return idList.pollFirst(); } } diff --git a/src/test/java/io/ebean/config/dbplatform/SequenceBatchIdGeneratorTest.java b/src/test/java/io/ebean/config/dbplatform/SequenceBatchIdGeneratorTest.java new file mode 100644 index 000000000..7969c8778 --- /dev/null +++ b/src/test/java/io/ebean/config/dbplatform/SequenceBatchIdGeneratorTest.java @@ -0,0 +1,62 @@ +package io.ebean.config.dbplatform; + +import org.junit.Test; + +import java.sql.ResultSet; +import java.util.List; + +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +public class SequenceBatchIdGeneratorTest { + + @Test + public void test() { + + TD generator = new TD(); + + // simulate out of order adding of sequence ids + generator.add(asList(1L, 2L)); + generator.add(asList(5L, 6L)); + generator.add(asList(3L, 4L)); + + assertThat(generator.nextId(null)).isEqualTo(1L); + assertThat(generator.nextId(null)).isEqualTo(2L); + assertThat(generator.nextId(null)).isEqualTo(3L); + assertThat(generator.nextId(null)).isEqualTo(4L); + assertThat(generator.nextId(null)).isEqualTo(5L); + assertThat(generator.nextId(null)).isEqualTo(6L); + } + + private class TD extends SequenceIdGenerator { + + protected TD() { + super(null, null, null, 10); + } + + void add(List ids) { + idList.addAll(ids); + } + + @Override + public String getSql(int batchSize) { + return "not used"; + } + + @Override + protected List readIds(ResultSet resultSet, int loadSize) { + // do nothing + return null; + } + + @Override + protected List getMoreIds(int requestSize) { + return null; + } + + @Override + protected void loadInBackground(int requestSize) { + // do nothing + } + } +}