mirror of
https://github.com/ebean-orm/ebean.git
synced 2026-10-24 03:57:45 +00:00
#1869 - out of order nextId() sequence generation
This commit is contained in:
@@ -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<Long> idList = new ArrayList<>(50);
|
||||
protected final NavigableSet<Long> 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Long> ids) {
|
||||
idList.addAll(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSql(int batchSize) {
|
||||
return "not used";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Long> readIds(ResultSet resultSet, int loadSize) {
|
||||
// do nothing
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Long> getMoreIds(int requestSize) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadInBackground(int requestSize) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user