Перейти к основному содержимому
Версия: 7.0

Параметры работы

Параметры работы — это настройки, определяющие поведение механизмов сервера приложений: пулы соединений, статистику оптимизатора, пороги защиты от слишком больших или слишком долгих запросов, политику повторов при конфликтах и блокировках, материализацию изменений, замеры потребления памяти, отображение элементов формы и т.п. В отличие от параметров запуска, фиксированных для процесса сервера, значение параметра работы задаётся перечисленными ниже способами и может перегружаться во время работы системы, в том числе для отдельной роли пользователя. Большинство параметров работы начинает действовать сразу после изменения значения; отдельные читаются только при запуске системы, что указано в описании параметра.

Параметры работы в платформе могут задаваться одним из следующих способов (в порядке их приоритетов, снизу более приоритетные):

  • В java коде в файле lsfusion.server.physics.admin.Settings.java (актуально для форков платформы)
  • В lsfusion.properties (обычно являются частью проекта, а значит действует по умолчанию для всех инсталляций) - название параметра должно начинаться на settings (например settings.enableUI)
  • В conf/settings.properties (для конкретных инсталляций) - название параметра должно начинаться на settings
  • В Java параметрах запуска название параметра должно начинаться на D и settings (например -Dsettings.enableUI=2)
  • В БД: Администрирование > Система > Настройки > Параметры. В этом интерфейсе можно задать как глобальные настройки, так и настройки для конкретных ролей
  • Во время выполнения действия, при помощи системных действий: Service.pushSetting[STRING, STRING], Service.popSetting[STRING] (перегружают значение свойства для всего текущего потока).

Параметры, управляющие выполнением запросов (например, тайм-ауты механизма материализации запросов), не действуют на уже скомпилированные запросы: вычисленное для запроса состояние выполнения — его тайм-ауты и шаги материализации — кэшируется вместе с запросом в кэше скомпилированных запросов, поэтому изменённый параметр применяется только к вновь компилируемым запросам. Константные литералы при компиляции параметризуются, поэтому запрос, отличающийся только литералом, также переиспользует уже скомпилированный запрос. Экспериментируя с такими параметрами, сочетайте Service.pushSetting[STRING, STRING] / Service.popSetting[STRING] со сбросом кэшей, чтобы запросы перекомпилировались с новыми значениями — как после изменения, так и после восстановления прежних: Service.dropLRUCustom[DOUBLE, BOOLEAN] (процент сбрасываемого и флаг случайного сброса) либо Service.dropLRU[], который берёт их из Service.dropLRUPercent[] / Service.randomDropLRU[] и ничего не делает, пока процент пуст.

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

Тип параметраОписаниеПо умолчанию
enableUIintОпределяет доступ к пользовательскому интерфейсу (в том числе для form api)
2 - Разрешать анонимный доступ
1 - Разрешать только аутентифицированный доступ
0 - Не разрешать доступ
1 (при старте сервера в режиме разработки - 2)
enableAPIintОпределяет доступ к программному интерфейсу (за исключением form api)
2 - Разрешать анонимный доступ
1 - Разрешать только аутентифицированный доступ
0 - По умолчанию не разрешать доступ. При этом значении внешние запросы всё равно разрешаются для действий с аннотацией @@noauth, для аутентифицированных запросов к действиям с аннотацией @@api, а также для аутентифицированных пользователей с доступом к форме навигатора System.interpreter.
0 (при старте сервера в режиме разработки - 2)
freeConnectionsintМаксимальное количество соединений в пуле соединений на сервере приложений12
statDegreeintОснование используемое для оценки количества записей (статистики) всеми оптимизаторами. Так оптимизаторы любое количество записей считают равным заданному основанию в некоторой степени (например если количество записей реально равно 1000, а основание 5, то оптимизатор считает количество записей равным 5 в 4-й степени). Соответственно, чем больше основание, тем менее точной становится статистика, а значит уменьшается время компиляции, размеры кэшей и генерируемых запросов, но при этом может существенно повышаться вероятность ошибки при построении правильного плана запроса.5
authTokenExpirationintВремя действия токена аутентификации в минутах.60*24 (1 день)
oauthAccessTokenExpiration
oauthRefreshTokenExpiration
oauthAuthCodeExpiration
int
int
int
Время действия (в минутах) токена доступа, токена обновления и кода авторизации, выдаваемых встроенным сервером авторизации OAuth; действуют, пока одноименные свойства модуля Authentication (Authentication.oauthAccessTokenExpiration[] и другие, задаваемые в форме настроек аутентификации) равны NULL.60
60*24*30 (30 дней)
10
reserveIDStepintКоличество ID, которые сразу резервирует сервер приложений для оптимизации при выполнении одиночных операций добавления объектов (при асинхронном вводе, одиночном NEW и т.п.)50
queryLengthTimeoutintПараметры механизма материализации запросов. queryLengthTimeout - с какой длины запроса включать этот механизм1000
useRequestTimeoutbooleanВключает механизм повторных удаленных вызовов, если эти вызовы выполняются слишком долго. Необходимо для разрешения ситуаций, когда вызов выполнен на сервере, но ответ из-за сетевых проблем не приходит (где-то теряется). Последнее обычно бывает, когда сервер приложений работает в виртуализированной среде. Соответственно, в таком случае эту настройку рекомендуется включать, и выключать в обратном случае.true
deleteFromInsteadOfTruncateForTempTablesInTransactionThresholdintКоличество записей, ниже которого временная таблица, возвращенная внутри транзакции, очищается через DELETE, а не через TRUNCATE, который внутри транзакции удерживает исключительную блокировку на нее до коммита. Записи, оставшиеся мертвыми от предыдущих очисток этой таблицы, учитываются в этом же пороге, так как до сброса ее хранилища их никто не освобождает. 0 возвращает TRUNCATE100000
useGlobalTempTablePoolbooleanВыдавать сессионную таблицу из пула, общего для всего узла сервера, вместо создания временной. Создание таблицы берет блокировку, которая до конца транзакции подавляет fast path менеджера блокировок для всего кластера PostgreSQL; таблица пула создается один раз на узел, а не по разу на каждое соединение, которому нужна такая форма. Если подходящего слота нет, используется обычная временная таблица. Только для PostgreSQL. В режиме разработки и в тестовом режиме включено по умолчаниюfalse
globalTempTablePoolTablespacestringТабличное пространство, в котором пул узла создает свои таблицы. Пустое значение - табличное пространство базы по умолчанию. Таблица пула - обычное постоянное отношение, поэтому temp_tablespaces на нее не распространяется: если временные таблицы вынесены в отдельное табличное пространство, его нужно указать здесь, и оно должно переживать перезапуск. Только для PostgreSQL``
globalTempTablePoolMaxTablesintКоличество таблиц, которое узел может держать в этом пуле одновременно, по всем формам. Сверх него запрос получает обычную временную таблицу2000
logTempTablesbooleanЗаписывает в logs/temptable.log каждую операцию над сессионной (временной) таблицей - создание, очистку через DELETE или TRUNCATE, удаление, ANALYZE, а также нашлась ли в пуле готовая, - помечая те из них, которые произошли внутри транзакции, и добавляет одну итоговую строку на транзакцию. Нужно для диагностики того, сколько таких операций берет транзакция: на PostgreSQL операции внутри транзакции удерживают свои блокировки до коммитаfalse
tempTablesTimeThreshold
tempTablesCountThreshold
int
int
Определяют минимальный порог времени жизни (в секундах) временной таблицы и количество таблиц на соединение, при превышении которых эти временные таблицы начинают очищаться / удаляться в регламентном режиме. Минимальный порог времени жизни таблицы должен быть соизмерим со стандартным временем использования временной таблицы. Чем эти пороги меньше, тем меньше потребление ресурсов сервером бд, но тем выше вероятность возникновения "ротации кэшей"240
40
queryRowCountPessLimit
queryRowCountOptDivider
int
int
Параметры механизма защиты от слишком больших запросов. queryRowCountPessLimit - минимальное количество записей, для которых начинает работать эта защита, queryRowCountOptDivider - порог, при превышении которого сервер приложений будет кидать ошибку (задается как часть памяти от всей имеющейся в распоряжении сервера приложений памяти, так если равно значение параметра равно 50, а объем памяти 100GB, то порог равен 100GB/50=2GB).1000
50
queryLengthLimitintПараметры механизма защиты от слишком длинных запросов. queryLengthLimit - длина запроса, при превышении которого сервер приложений будет кидать ошибку.2000000
remoteLogTimeintПорог времени выполнения (в миллисекундах), при превышении которого удаленный вызов записывается в соответствующий лог (server-remote)3000
explainThreshold
explainJavaStack
explainCompile
int
boolean
boolean
Параметры вывода логов планов выполнения запросов
  • explainThreshold - порог времени выполнения (в миллисекундах), при превышении которого SQL-запрос записывается в соответствующий лог (explain). Используется только если для пользователя включен Service.explainAnalyzeMode[User].
  • explainJavaStack - определяет надо ли выводить помимо lsf-стэка, также и java-стэк в лог.
  • explainCompile - выводит в специальный лог (explaincompile) информацию о компиляции запроса (предполагаемые планы, проталкивания условий внутрь подзапросов и т.п.).
100
false
false
startServerAnyWaybooleanСтартовать сервер, даже при наличии ошибок в структуре индексов или синхронизации метаданныхfalse
dryRunbooleanОстанавливает старт сервера сразу после того, как логика (модули, классы, свойства, действия) скомпилирована и проверена, до установления соединения с базой данных. Полезно для проверки изменений в .lsf без подключения к реальной базе данныхfalse
batchScriptErrorsbooleanПродолжать проверку модуля после найденной семантической ошибки, чтобы за один запуск сообщалась не только первая из них. Сообщается столько ошибок, сколько удается разобрать после сбоя, а не обязательно все, что есть в модуле. dryRun включает этот режим всегда. Читается при стартеfalse
maxScriptErrorsPerModuleintСколько ошибок сообщать по одному модулю при включенном batchScriptErrors. По достижении этого числа модуль перестает проверяться10
useISOTimeFormatsInIntegrationbooleanЗаписывать значения даты и времени строками в форматах ISO 8601 в текстовых форматах интеграции (JSON, XML, CSV). Если параметр сброшен, используются форматы текущей локалиtrue
removeJoinCutBackwardCompatibilitybooleanВосстанавливает поведение проталкивания предикатов до версии 7.0: join'ы, зависящие от цели проталкивания, вырезаются из проталкиваемого условия целиком, вместо того чтобы сохраняться с виртуализацией зависящих аргументов. Используется как быстрый fallback, если после перехода на 7.0 отдельные запросы падают с ошибкой некорректной операции над множеством или получают более медленные планы (см. issue #1699)false
keyExprCompareJoinBackwardCompatibilitybooleanВосстанавливает обработку сравнений с интервалами при планировании проталкивания предикатов до версии 7.0 (без key compare join'ов и с защитами от висячих интервальных ключей, которые они заменили). Вместе с removeJoinCutBackwardCompatibility полностью восстанавливает планирование проталкивания версии до 7.0false
allowNestedTransactionbooleanРазрешает другой сессии работать на sql-сессии, уже находящейся в транзакции: её чтения и изменения присоединяются к этой транзакции вместо ошибки (видят её незафиксированные данные и исчезают при её откате, а применение изменений там не атомарно само по себе - его фиксация физически ничего не делает). Может включаться для одного стека через pushSetting / popSetting, если это сделано осознанно (см. issue #1726)false
allowUserInteractionInTransactionbooleanРазрешает взаимодействие с пользователем внутри транзакции: диалог, сообщение или запрос ввода внутри APPLY только логируется вместо ошибки (транзакция и её блокировки удерживаются на время раздумий пользователя). Может включаться для одного стека через pushSetting / popSetting, если такое взаимодействие сделано осознанно (см. issue #1726)false
prefixIndexIntervalBackwardCompatibilitybooleanВосстанавливает учет интервальных условий только по первому полю индекса (интервал по полю, стоящему в составном индексе дальше, не учитывается). Читается при стартеfalse
conflictSleepThreshold
conflictSleepTimeDegree
int
int
Параметры устранения повторяющихся update conflict'ов:
  • сonflictSleepThreshold - после какого количества неудачных (когда возникал конфликт) попыток включать механизм.
  • conflictSleepTimeDegree - основание времени (в секундах), на степень попыток которого необходимо останавливать поток (например если основание 2 то на третьей попытке таймаут будет 8, на четвертой - 16 и т.п.)
3
2
timeoutNanosPerRowintСреднее количество наносекунд на обработку одного ряда (необходимо для оценки того, сколько приблизительно должен выполняться запрос). Если это расчетное время превышено платформа пытается материализовать некоторые подзапросы (или как-то изменить этот запрос на более пессимистичный) и выполнить запрос снова. Уменьшение этого параметра может приводить, к более частым материализациям и вообще дополнительным повторным выполнениям запроса, увеличение может привести к использованию неправильных планов (прежде всего nested loop'ов на соединении больших таблиц), в случаях когда, к примеру, SQL сервер неправильно оценивает статистику подзапросов.20
deadLockThresholdintПараметры устранения повторяющихся dead lock'ов. deadLockThreshold - после какого количества неудачных (когда возникал dead lock) попыток включать механизм.0
periodRestartConnections
percentRestartConnections
int
int
Параметры механизма перестарта соединений. periodRestartConnections - определяет как часто (период в секундах) будет запускаться этот механизм. percentRestartConnections - какой процент соединений с максимальным скорингом будет перестартовываться.60
1
closeConfirmedDelay
closeNotConfirmedDelay
int
int
Задержки (в миллисекундах) окончательного закрытия формы после инициации ее закрытия на сервере. closeConfirmedDelay - время, которое дается клиенту на то, чтобы закончить все дела с формой после того, как он подтвердил закрытие (этот механизм нужен для экономии round trip запроса при закрытии формы). closeNotConfirmedDelay - время, по истечении которого форма закрывается в любом случае, если подтверждения от клиента не пришло.5000
300000
defaultCompareForStringContainsbooleanИспользовать Содержит в качестве фильтра по умолчанию в пользовательских фильтрахfalse
limitHintIncrementComplexity
limitComplexityGrowthCoeff
limitHintIncrementStat limitHintIncrementValueComplexity
limitApplyHintIncrementComplexity
limitApplyHintIncrementStat
int
double
int
int
int
int
Параметры управления сложностью изменений (материализация изменений свойств, когда сложность инкрементальных вычислений становится слишком большой):
  • limitHintIncrementComplexity - порог сложности (определяется как приблизительное количество выполняемых операторов), при превышении которого изменения свойства материализуются во временную таблицу. Этот порог должен превышаться или условием, определяющим наборы объектов, для которых изменилось свойство, или непосредственно значением этого свойства (для значения также дополнительно проверяется, что рост сложности по сравнению с вычислением без изменений превышает limitComplexityGrowthCoeff)
  • limitHintIncrementStat - порог предполагаемого количества наборов объектов, для которых изменяется свойство, при превышении которого изменения материализоваться не будут (чтобы не материализовывать очень большое количество данных). Это значение умножается на квадрат отношения сложности изменения к порогу (чем больше сложность, тем меньшим злом является дополнительные затраты на сохранение большого объема данныъ), а также, после этого умножения, проверяется, что полученный порог должен быть не меньше максимального количества записей среди всех использованных временных таблиц (если меньше, то увеличивается до этого значения).
  • limitHintIncrementValueComplexity - по умолчанию если один из параметров свойства константное заранее известное значение, его изменения материализоваться не будут. В то же время сложность может расти очень быстро, поэтому в платформе существует дополнительный порог, при превышении которого изменения будут материализоваться даже в этом случае (с константным параметром). Впрочем, если свойство помечено специальной опцией COMPLEX, или зависит от такого свойства, его изменения, когда один из параметров константное значение, не будут материализоваться никогда.
  • limitApplyHintIncrementComplexity, limitApplyHintIncrementStat - параметры аналогичные верхним без префикса Apply, и соответственно используются при выполнении действий внутри оператора применения изменений (APPLY) (например внутри обработки событий)
При повышении всех вышеперечисленных параметров компилятор и оптимизатор будут иметь больше информации (возможно избыточной) для построения более эффективных планов, но при этом будут потреблять больше процессорного времени / памяти (зачастую значительно, поэтому не рекомендуется устанавливать их слишком большими)
50
1.5
200
1000
100
1000
excessThreadAllocatedBytes
excessInterruptCount
threadAllocatedMemoryPeriod
long
int
int
Параметры механизма защиты от слишком большого потребления памяти на сервере приложений:
  • excessThreadAllocatedBytes - количество байт, при превышении которого считается, что поток потребляет слишком много памяти
  • excessInterruptCount - количество подряд идущих замеров, в течении которых поток потребляет слишком памяти, при превышение которого поток будет прерван
  • threadAllocatedMemoryPeriod - период (в секундах), определяющий как часто проводятся замеры потребления памяти потоками
5368709120L (5GB)
4
180 (3 минуты)
useSavePointsThreshold
savePointCountForExceptions
updateSavePointsMinMultiplier
updateSavePointsMaxMultiplier
int
int
double
double
Параметры механизма использования savepoint'ов в транзакциях (для того чтобы не перестартовывать всю транзакцию, например в механизме материализации подзапросов):
  • useSavePointsThreshold - количество одновременных savepoint'ов на сервере приложений. Чем выше, тем реже будут перестартовываться транзакции, но с тем большей вероятностью некоторые СУБД (например Postgres) будут уходить в глобальные блокировки (LWLock - в Postgres). Этот параметр является адаптивным может меняться в зависимости от реальной потребности в использовании savepoint'ов (так как механизм savepoint'ов включается только после некоторого количества перестартов транзакции).
  • savePointCountForExceptions - количество перестартов транзакции, при превышении которого включается механизм savepoint'ов (-1 - отключить вообще).
  • updateSavePointsMaxMultiplier, updateSavePointsMinMultiplier - минимальный и максимальные коэффициенты, которые могут устанавливаться сервером при адаптивном определении количества одновременных savepoint'ов на сервере приложений (к примеру по умолчанию эти коэффициент 0.8 и 3.0, то есть минимальное таргетируемое количество одновременных savepoint'ов - 5*0.8=4, максимальное - 5*3=15)
5
-1
0.8
3.0
changeBooleanOnSingleClickbooleanОпределяет будет ли событие изменения свойства логического типа на форме инициироваться по одиночному (true) или двойному (false) клику мышине задан (клиент решает по виду клика)
changeActionOnSingleClickbooleanОпределяет будет ли событие вызова действия на форме инициироваться по одиночному (true) или двойному (false) клику мышиtrue
defaultAutoImageRankingThreshold
defaultNavigatorImageRankingThreshold
defaultNavigatorImage
defaultContainerImageRankingThreshold
defaultContainerImage
defaultPropertyImageRankingThreshold
defaultPropertyImage
float
float
boolean
float
boolean
float
boolean
Параметры механизма автоматической установки иконок0.0f
0.1f
true
0.6f
false
0.8f
false
maxStickyLeftdoubleДоля ширины таблицы, которую в веб-клиенте могут занимать закрепленные слева колонки (опция свойства STICKY); колонки, не уместившиеся в нее, не закрепляются.0.33
useShowIfInReportsbooleanПри построении отчета удаляет из шаблона расположенные непосредственно в бэнде текстовые поля свойств, поле SHOWIF которых объявлено в шаблоне и равно NULL в первой строке отчета, вместе с занимаемой ими полосой.true
contentWordWrap
highlightDuplicateValue
userFiltersManualApplyMode
suppressOnFocusChange
boolean
boolean
boolean
boolean
Значения по умолчанию настроек оформления «перенос текста», «подсветка дубликатов», «ручное применение фильтров» и «начинать редактирование при фокусе» (интерфейс пользователя) для пользователей, которые их не задали.false
false
false
false
newConnectionAttemptsintСколько раз открытие нового соединения с базой данных повторяется после неудачи, прежде чем ошибка будет выброшена вызывающему3
disablePoolConnectionsbooleanОтключает пул соединений с базой данных: возвращаемое соединение закрывается, а не сохраняется для повторного использования (пул хранит до freeConnections свободных соединений на каждый узел базы данных). Предназначен для диагностикиfalse
disablePoolPreparedStatements
queryPrepareLength
queryPrepareRunTime
boolean
int
int
Параметры пула prepared statement'ов. Запрос, текст которого длиннее queryPrepareLength символов, а выполнение заняло больше queryPrepareRunTime миллисекунд, сохраняется подготовленным на своем соединении и используется повторно; disablePoolPreparedStatements отключает пулtrue
1000
40
checkCurrentDate
checkCurrentDataDateTime
int
int
Периоды (в секундах) системных задач, обновляющих Time.currentDate[] при смене дня и снимки Time.currentDateTimeSnapshot[] / Time.currentZDateTimeSnapshot[]30
1800
updateFormCountPeriod
updateUserLastActivity
updatePingInfo
int
int
int
Периоды (в секундах) системных задач, записывающих накопленную в памяти активность клиентов в базу данных: сколько раз открывалась каждая форма, время последней активности каждого подключения и статистику ping по каждому компьютеру30
30
3600
notificationCleanupPeriodintСколько (в секундах) сервер хранит уведомление для клиента, который его еще не забрал (вызов NEWEXECUTOR CLIENT, внешний UI redirect и т.п.), сверх собственной задержки или периода вызова; периодический вызов продлевает срок при каждом срабатывании. Просроченные удаляет задача с тем же периодом600
flushPendingTransactionCleanersThresholdintПериод (в секундах) задачи, освобождающей уже не нужные сессии временные таблицы, если их освобождение пришлось отложить, потому что соединение сессии в этот момент находилось в транзакции10
schedulerLogFlushIntervalintПериод (в секундах), с которым сообщения, которые выполняющаяся задача планировщика пишет в свой лог, сбрасываются в базу данных5
periodProcessDumpintПериод (в секундах) задачи, записывающей список выполняющихся SQL- и Java-процессов (то, что показывает монитор процессов) в logs/processdump.log60
periodBalanceConnections
percentBalanceConnections
int
double
Параметры балансировки соединений между узлами базы данных (см. масштабирование базы данных): каждые periodBalanceConnections секунд percentBalanceConnections процентов соединений (не меньше одного), начиная с тех, что находятся на самом загруженном узле и держат меньше всего строк временных таблиц, переносятся на наименее загруженный узел5
1
readSQLServerCpuTimePeriodintПериод (в секундах), с которым по SNMP (snmpPort[DBServer]) читается загрузка CPU каждого узла базы данных и пересчитывается оценка нагрузки, по которой выбирается узел для нового соединения (см. веса ниже)5
baseConnWeight
extraConnWeight
lagSensitivity
lagScale
masterPenalty
double
double
double
double
double
Веса оценки нагрузки узла базы данных; новое соединение уходит на узел с наименьшей оценкой. Оценка равна загрузке CPU (0..1) плюс (baseConnWeight + extraConnWeight × загрузка CPU) × доля узла во всех соединениях, плюс для реплики lagSensitivity × lag / (lagScale + lag), где lag - отставание репликации в секундах (то есть при отставании в lagScale секунд это слагаемое равно половине lagSensitivity), плюс masterPenalty для мастера0.3
0.9
2.0
2.0
0.1
tempStatisticsTargetintdefault_statistics_target, с которым выполняется ANALYZE временной таблицы (PostgreSQL); 0 оставляет настройку сервера10
deleteFromInsteadOfTruncateForTempTablesThreshold
deleteFromInsteadOfTruncateForTempTablesUnknown
int
boolean
Аналоги deleteFromInsteadOfTruncateForTempTablesInTransactionThreshold вне транзакции: количество строк (включая оставшиеся мертвыми после предыдущих очисток), ниже которого временная таблица очищается через DELETE, а не TRUNCATE, 0 - всегда TRUNCATE; флаг выбирает DELETE для таблицы, количество строк в которой неизвестно, в том числе внутри транзакции0
false
applyAutoAttemptCountLimit
dialogTransactionTimeout
int
int
Что происходит, когда транзакция применения изменений отменена по тайм-ауту запроса. Без пользователя (задача планировщика, внешний вызов) применение повторяется до applyAutoAttemptCountLimit раз, после чего отменяется. С пользователем показывается диалог с предложением повторить, повторить без тайм-аута или отменить, а dialogTransactionTimeout - сколько (в миллисекундах) диалог ждет ответа, прежде чем отменить3
5000
tooMuchRetryAttempts
tooMuchAttempts
int
int
Сколько раз применение изменений повторяется после временной ошибки, прежде чем ошибка будет выброшена: tooMuchRetryAttempts для ошибок prepared statement'а, ставшего недействительным после изменения схемы (повторная подготовка их устраняет), tooMuchAttempts для нарушения уникальности, которое может быть гонкой между сессиями3
15
trueSerializableAttemptsintВ режиме уровня изоляции транзакций (см. disableTILMode[] в System_Service) применение начинается на уровне SERIALIZABLE и остается на нем в течение trueSerializableAttempts повторов после конфликтов обновления; последующие повторы выполняются на REPEATABLE READ. 0 - SERIALIZABLE не используется0
timeoutStart
timeoutDegree
timeoutMinMillis
int
int
long
Параметры тайм-аутов запросов в механизме материализации запросов (см. queryLengthTimeout, timeoutNanosPerRow). Запрос, отмененный по тайм-ауту, повторяется попеременно с волатильной статистикой и без нее, начиная с тайм-аута в timeoutStart секунд, который умножается на timeoutDegree на каждом втором повторе. timeoutMinMillis - нижняя граница (в миллисекундах) времени выполнения, оцененного по timeoutNanosPerRow3
5
100
maxThreadAllocatedBytes
cacheMissesStatsLimit
long
int
Пороги периодического замера памяти (см. threadAllocatedMemoryPeriod), при превышении которых поток записывается в logs/allocatedbytes.log вместе со статистикой своих кэшей: байты, выделенные потоком за период, и промахи кэшей за период500048576 (~500MB)
10000
updateStatisticsLimitintКоличество измененных строк временной таблицы, после которого ее статистика пересчитывается; независимо от количества она пересчитывается и тогда, когда изменение переводит количество строк таблицы в другой порядок (см. statDegree)300
majorStatChangeDegree
updateStatsDropLRUThreshold
int
int
majorStatChangeDegree - множитель, statDegree в степени majorStatChangeDegree (25 при значениях по умолчанию), который задача обновления статистики использует дважды: статистика таблицы обновляется, когда строк, добавленных с последнего обновления, стало больше ее оценки количества строк в этот множитель раз (или удаленных - больше самой оценки), а обновление, изменившее оценку таблицы или класса в этот множитель раз, считается существенным изменением. Как только существенных изменений, накопившихся с последнего сброса, становится больше updateStatsDropLRUThreshold, сбрасываются кэши (LRU), поскольку планы в них построены на старой статистике2
1
disableSyncStatPropsbooleanНе вычислять статистику (оценку количества значений) каждого свойства при синхронизации объектов рефлексии (Reflection.Property) с базой данных при старте; вместо нее записывается статистика по умолчанию. Читается при стартеfalse
maxNumericPrecision
maxNumericScale
int
int
Точность и количество знаков после запятой для NUMERIC, объявленного без них, и верхние границы для объявленных127
32
useMaxDivisionLengthbooleanРезультат деления значений NUMERIC получает maxNumericScale знаков после запятой (делимое приводится к этому типу перед делением). Если выключено, количество знаков равно сумме знаков после запятой делимого и целых знаков делителя - поведение прежних версийtrue
safeCastIntTypeintКак значение, которое может не поместиться, приводится к целочисленному типу: 0 - PL/pgSQL-функция, перехватывающая ошибку приведения и возвращающая NULL (подвержена ошибке PostgreSQL 13 при отмене запроса), 1 - SQL-функция, возвращающая NULL, если значение вне диапазона типа, 2 - обычное приведение в арифметике, при непомещающемся значении выбрасывается ошибка СУБД (приведение из строки сохраняет функцию)1
updateSavePointsPeriod
updateSavePointsResultPeriod
updateSavePointsCoeff
int
int
double
Адаптация useSavePointsThreshold: каждые updateSavePointsPeriod секунд сервер проверяет, укладываются ли нужные в этот момент savepoint'ы в текущий порог, а каждые updateSavePointsResultPeriod секунд делит множитель порога на updateSavePointsCoeff, если они укладывались больше чем в 80% проверок, или умножает на updateSavePointsCoeff, если меньше чем в 60% (оставаясь в пределах updateSavePointsMinMultiplier и updateSavePointsMaxMultiplier)30
1800
1.3
isClusteredbooleanСервер - один из нескольких серверов приложений, работающих с одной базой данных. Отключает локальные кэши сервера, которые предполагают, что данные меняет только он: кэш значений асинхронного ввода и отслеживание удаленных объектов, позволяющее сессии пропускать проверки классовfalse
restrictLongValuesInStatbooleanОграничивает количества строк, записываемые в статистику рефлексии (Reflection.quantity[Property], количества строк таблиц и классов), значением 2147483647 - так их хранила версия 6. Оставьте включенным, пока что-то в приложении еще ожидает там INTEGERtrue
noDisablingNestedLoop
lastStepCoeff
subQueriesSplit
subQueriesRowsThreshold
subQueriesRowsMax
subQueriesRowCountCoeff
subQueriesParentCoeff
subQueriesPessQueryCoeff
boolean
int
int
int
int
int
int
int
Параметры механизма материализации запросов (см. timeoutNanosPerRow). Запрос, не уложившийся в свой тайм-аут, выполняется заново с частью подзапросов, материализованных во временные таблицы, шаг за шагом, причем каждый шаг материализует больше; последний шаг вместо этого отключает в СУБД соединения nested loop (enable_nestloop).
  • noDisablingNestedLoop - не делать этот последний шаг: вместо него предыдущий шаг выполняется без тайм-аута
  • lastStepCoeff - используется только в двух местах: когда последний шаг не удался, тайм-ауты двух последних шагов умножаются на него и запрос повторяется, а после успеха механизм возвращается на более ранний, дешевый шаг, если общее время текущего, включая материализацию, превысило тайм-аут того раннего шага в этот коэффициент раз
  • subQueriesSplit - на сколько частей шаг делит запрос: для материализации выбираются подзапросы, размер которых во вложенных подзапросах ближе всего к размеру запроса, деленному на это число
  • subQueriesRowsThreshold, subQueriesRowsMax - оценка размера результата (в строках), ниже которой размер подзапроса не влияет на выбор, и выше которой подзапрос не материализуется, если только весь запрос не оценивается еще больше
  • subQueriesRowCountCoeff, subQueriesParentCoeff, subQueriesPessQueryCoeff - веса при выборе: оценка размера подзапроса считается против него с весом subQueriesRowCountCoeff, каждое место, откуда подзапрос используется (в каждом из них он выполнялся бы заново), считается за него с весом subQueriesParentCoeff, а подзапрос с пессимистичным вариантом выполнения откладывается в subQueriesPessQueryCoeff раз, чтобы сначала материализовались оптимистичные
true
5
4
1000
100000
2
2
2
LRURangeDefaultCoeff
LRURangeMinCoeff
LRURangeMaxCoeff
targetLRURangePercent
criticalLRURangePercent
targetLRUAdjustIncCoeff
targetLRUAdjustDecCoeff
criticalLRUAdjustCoeff
stableLRUMinCount
unstableLRUMaxCount
disableLRUCollectionUsageThreshold
memGCCollectionThresholdCooldown
double
double
double
long
long
double
double
double
long
long
boolean
int
Параметры тюнера кэшей сервера (LRU). Элемент кэша живет базовое время этого кэша, умноженное на общий множитель, а тюнер двигает множитель по памяти, которую старое поколение Java-кучи продолжает занимать после сборки мусора, чтобы кэши занимали свободную память и не больше. Старое поколение делится четырьмя уровнями: критический, на 100 - criticalLRURangePercent процентах от него, и ниже, с шагом в criticalLRURangePercent, а затем в targetLRURangePercent, верхняя, средняя и нижняя границы целевого диапазона (85, 70, 60 и 50 процентов при значениях по умолчанию).
  • LRURangeDefaultCoeff, LRURangeMinCoeff, LRURangeMaxCoeff - начальный множитель (1.0 дает самым распространенным кэшам час) и границы, за которые он дальше не двигается (шаг, начатый внутри границы, все же может закончиться за ней)
  • targetLRURangePercent, targetLRUAdjustIncCoeff, targetLRUAdjustDecCoeff - тюнер проверяет память каждую секунду; как только она продержалась неизменной больше stableLRUMinCount секунд после изменения (или менялась больше unstableLRUMaxCount секунд подряд), значение выше верхней границы целевого диапазона делит множитель на 1 + targetLRURangePercent/100 × targetLRUAdjustDecCoeff, значение ниже нижней границы умножает его на 1 + targetLRURangePercent/100 × targetLRUAdjustIncCoeff
  • criticalLRURangePercent, criticalLRUAdjustCoeff, memGCCollectionThresholdCooldown - когда сборка оставляет память выше критического уровня, из каждого кэша сразу удаляется доля, возвращающая память к середине целевого диапазона, а множитель делится на 1 + эта доля × criticalLRUAdjustCoeff; такая реакция происходит не чаще раза в memGCCollectionThresholdCooldown секунд
  • disableLRUCollectionUsageThreshold - следить за памятью в текущий момент, а не за памятью после сборки (на этот режим тюнер переходит и сам, если JVM не сообщает вторую); в этом режиме у критической реакции нет паузы, она повторяется, с тем же удалением и делением, пока память не опустится ниже критического уровня
1.0
0.1
5.0
10
15
1.0
2.0
1.0
40
80
false
90
queryLengthAverageMax
queryTimeAverageMax
queryExecuteDegree
timeStartedAverageMaxCoeff
timeStartedDegree
maxUsedTempRowsAverageMax
maxUsedTempRowsDegree
usedTempRowsAverageMax
usedTempRowsDegree
lastTempTablesActivityAverageMax
int
int
int
double
double
int
double
int
double
int
Оценка в механизме перезапуска соединений (см. periodRestartConnections, percentRestartConnections): при каждом запуске перезапускаются соединения с наибольшей оценкой: соединение заменяется новым, временные таблицы, которыми сессия еще пользуется, переезжают на него вместе со строками, остальные и prepared statement'ы пропадают. Параметры ...AverageMax - нормальные величины, ...Degree - степени, в которые возводятся отношения к ним; временные таблицы соединения измеряются общим числом строк в них. Оценка соединения складывает
  • по каждому выполненному на нем запросу - его длину в символах и время в миллисекундах, деленные на queryLengthAverageMax и queryTimeAverageMax, каждое в степени queryExecuteDegree
  • его возраст, деленный на нормальное время жизни соединения, в степени timeStartedDegree; нормальное время жизни - это periodRestartConnections × 100 / percentRestartConnections секунд (время, за которое механизм обходит все соединения), умноженное на timeStartedAverageMaxCoeff
  • наибольшее число строк временных таблиц, которое оно держало одновременно, деленное на maxUsedTempRowsAverageMax, в степени maxUsedTempRowsDegree
  • и вычитает число строк временных таблиц, которые оно держит сейчас, деленное на usedTempRowsAverageMax, в степени usedTempRowsDegree, за вычетом миллисекунд с последнего обращения к временной таблице, деленных на lastTempTablesActivityAverageMax, в степени timeStartedDegree (соединение, которое держит много строк временных таблиц и пользуется ими, щадится, а которое держит их без дела - нет); эта часть не может уйти ниже нуля
10000
10000
2
1.25
8
5000
2
500
4
180000
к сведению

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