Сначала немного предыстории:
1. Понять, как COnnection Pooling используется NPGSQL в ASP.NET REST API
Окружающая среда:
- У нас есть контроллер REST API, который сначала запрашивает список элементов (в RDS), а затем для каждого элемента в этом списке нам нужно получить некоторые дополнительные значения, поэтому мы используем оператор Parallel.ForEach
- Каждый раз, когда мы используем соединение, мы используем его правильно
- Я видел, что каждый раз, когда эта конечная точка вызывается, количество соединений увеличивается, а затем они удаляются.
Процесс:
Я следовал http://www.npgsql.org/doc/performance.html#performance-counters, чтобы проверить, как NPGSQL обрабатывает соединения, также добавил следующее в строку соединения:
"CommandTimeout = 50000; TIMEOUT = 1024; POOLING = True; MINPOOLSIZE = 1; MAXPOOLSIZE = 100; Использовать счетчики Perf = true;"
но я нашел странный результат:
NumberOfNonPooledConnections и NumberOfPooledConnections всегда одинаковы, в моем случае (56) мы используем Parallel.ForEach для запроса нескольких элементов.
Значение для NumberOfActiveConnectionPools равно 1.
Сначала я не мог понять, как это работает, действительно ли он использовал пул соединений?
Затем я прекращаю процесс удаления "; POOLING = True;" из строки подключения и у меня тот же результат.
Наконец я установил "; POOLING = false;" и выполните снова, теперь NumberOfPooledConnections поднялся на крышу, достигнув 2378, и затем он начал рассчитывать время открытия новых соединений.
В метриках производительности RDS я также отметил, что количество соединений никогда не превышало 110 соединений.
Так что вопросы будут такими:
Какими будут критерии для установки параметра MaxPoolSize? 100 кажется обычным.
В ASP.NET пул соединений обрабатывается экземпляром? Таким образом, все подключения, сделанные из одного пула приложений в IIS, будут использоваться повторно или будут выполняться?.