безопасно ли вызывать setval из curval + 10 в postgresql? - PullRequest
0 голосов
/ 11 июля 2019

Я использую Postgres в качестве базы данных для моего проекта Hibernate Java Spring.

Чтобы обеспечить лучшую производительность при вставке, я использую последовательность пула, которая требует, чтобы последовательности базы данных имели значение приращения, равное размеру пула (скажем, 10).

Это вызывает множество проблем. Ручные вставки во время работы должны либо эмулировать алгоритм объединения, либо увеличивать каждую вставку на 10, используя nextval в качестве идентификатора каждый раз.

Конфигурация также более сложна, поскольку каждая последовательность должна быть настроена (например, не может использовать последовательный как есть). Кроме того, все серверы, которые вставляются в таблицу, должны иметь одинаковый размер пула, что заставляет синхронизировать всю конфигурацию с базой данных.

Можно ли было бы реализовать алгоритм последовательности, который бы делал что-то вроде setval('seq', curval('seq') + poolsize), чтобы позволить серверу выбирать желаемый размер пула, сохраняя при этом неявный контракт, которым может свободно пользоваться любое число выше curval. Я специально спрашиваю о любой проблеме одновременного вызова двух методов, чтобы сделать то, что должно быть атомарной операцией (например, например, AtomicInteger addAndGet).

Это приводит ко второму вопросу: есть ли какой-нибудь плагин Postgres, который бы добавил это поведение в последовательности? Так как я знаю, такое поведение возможно реализовать.

1 Ответ

0 голосов
/ 11 июля 2019

Предлагаемый вами метод уязвим для состояния гонки.

Некоторые параметры:

  • Вы можете упаковать свой метод в функцию PostgreSQL и защитить его от одновременных вызовов с помощью консультативный замок .Это, конечно, будет работать только в том случае, если все использование последовательности осуществляется через функцию.

    Подробнее см. мой блог .

  • Вы можете определитьваша последовательность с CACHE из 10. Вы не получаете пакеты переменного размера, но к последовательности обращаются только каждый десятый раз, и значения кэшируются в сеансе базы данных.

    Это наиболееэффективный способ выполнить ваше требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...