Как найти потоки пула соединений JDBC, созданные в приложении SpringBoot?

У меня были следующие свойства в моем приложении Spring Boot 1.4, разговаривающем с локальным MySQL с использованием JDBC:

  • spring.datasource.test-while-idle=true
  • spring.datasource.test-on-заимствование = правда
  • spring.datasource.validation-query=ВЫБЕРИТЕ 1
  • spring.datasource.initial-size=50
  • весна.источник данных.макс-актив=100
  • spring.datasource.max-idle=50
  • spring.datasource.min-idle = 50
  • spring.datasource.initial-size=50
  • spring.datasource.tomcat.max-active=100
  • spring.datasource.tomcat.max-idle=50
  • spring.datasource.tomcat.min-idle=50
  • spring.datasource.tomcat.initial-size=50

Я знаю, что последние четыре строки повторяются, но я сохранил их, чтобы попробовать, сработает ли какая-либо комбинация. В документации Spring Boot говорится, что все свойства tomcat источника данных должны находиться в spring.datasource.tomcat.*. С другой стороны, первые три строки работают на SpringBoot 1.3 и 1.4. Таким образом, ожидалось, что параметры пула соединений также будут работать.

После запуска приложения я проверил все его потоки в VisualVM. Количество составляет ~ 20, что намного меньше, чем 50, которые я установил. После запуска, скажем, 1000 вызовов REST, которые общаются с MySQL с использованием репозиториев Spring Data, я вижу, что количество потоков превышает 50. Однако после завершения вызовов REST и через некоторое время количество потоков снижается до ~ 30. Я вижу, что ~ 10 рабочих потоков остаются бездействующими.

Итак, мой вопрос: как вы обнаружите потоки пула соединений JDBC в пуле потоков приложения Spring Boot?

Кроме того, что не так в конфигурации свойств? Почему пул соединений JDBC с ожидаемым количеством потоков не создается?


person Martin    schedule 21.09.2016    source источник


Ответы (1)


Пул соединений не создает потоков (или: он может создать 1 или 2 для обслуживания, но это все). Пул соединений создает (и отслеживает) JDBC-соединения с базой данных для передачи, когда ваше приложение запрашивает это. Нет необходимости иметь поток для каждого соединения в самом пуле.

Большинство потоков, которые вы видите, исходят из самой Java (например, сборка мусора и т. д.) плюс потоки, необходимые для обработки HTTP-соединений (количество которых может увеличиваться при нагрузке и уменьшаться при простое), а также любые другие потоки, запускаемые кодом вашего приложения.

person Mark Rotteveel    schedule 21.09.2016
comment
Благодарю вас! Я видел только поток Tomcat JDBC Pool Cleaner, поэтому сомневался в создании потока или отдельного потока. - person Martin; 22.09.2016