Я использую Postgres в качестве базы данных для моего проекта Hibernate Java Spring.
Чтобы обеспечить лучшую производительность при вставке, я использую последовательность пула, которая требует, чтобы последовательности базы данных имели значение приращения, равное размеру пула (скажем, 10).
Это вызывает множество проблем. Ручные вставки во время работы должны либо эмулировать алгоритм объединения, либо увеличивать каждую вставку на 10, используя nextval в качестве идентификатора каждый раз.
Конфигурация также более сложна, поскольку каждая последовательность должна быть настроена (например, не может использовать последовательный как есть).
Кроме того, все серверы, которые вставляются в таблицу, должны иметь одинаковый размер пула, что заставляет синхронизировать всю конфигурацию с базой данных.
Можно ли было бы реализовать алгоритм последовательности, который бы делал что-то вроде setval('seq', curval('seq') + poolsize)
, чтобы позволить серверу выбирать желаемый размер пула, сохраняя при этом неявный контракт, которым может свободно пользоваться любое число выше curval. Я специально спрашиваю о любой проблеме одновременного вызова двух методов, чтобы сделать то, что должно быть атомарной операцией (например, например, AtomicInteger addAndGet).
Это приводит ко второму вопросу: есть ли какой-нибудь плагин Postgres, который бы добавил это поведение в последовательности? Так как я знаю, такое поведение возможно реализовать.