Макс соединение странно взорвано, в то время как множество незанятых соединений - PullRequest
1 голос
/ 20 марта 2019

Я проверил макс. Доступное соединение должно быть 97, поскольку мое max_connection равно 100 , а superuser_reserved_connections равно 3 по умолчанию.

Я использую hibernate-envers 5.2.3.Final и Spring Boot 1.5.2.RELEASE для управления операциями с базой данных.

Я использую @Autowired, чтобы связать репозиторий и передать его в сотни потоков, которые будут выполнять поиск и сохранять в базу данных.

Мне было предложено исключение соединения, но когда я проверяю соединения через pgAdmin4

enter image description here

Вопросы

  1. Почему соединение такое высокое, в то время как простаивает , занимая почти все соединения?
  2. Будет ли каждая операция в Hibernate создавать соединение?Есть какой-нибудь официальный документ для разработки этого дизайна?
  3. Есть ли какой-нибудь способ, которым я могу освободить лодыри в Hibernate?
  4. Или на самом деле есть другое место, в которое я должен взглянуть вместо Hibernate?1042 *

    Обновлено

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

    Любая помощь будет оценена;)

Ответы [ 2 ]

1 голос
/ 21 марта 2019

С помощью @ g00glen00b я проверил зависимости Spring Boot и обнаружил, что Tomcat 8.5.11 фактически используется Spring Boot.

Существуют атрибуты maxIdle & minEvictableIdleTimeMillis, используемые tomcat для контроля того, сколько разрешенных подключений разрешено и как долго они могут оставаться до выселения. По умолчанию это maxActive: 100, что прямо объясняет все.

А в Spring Boot вы можете управлять этим атрибутом как spring.datasource.tomcat.max-idle=50.

Но, как упомянул @ g00glen00b, возможно, неправильно управлять этим значением напрямую, что может повредить производительности. Его следует использовать с большой осторожностью и четким намерением, основанным на самой системе.

В моем случае я их не трогал, я реорганизовал свой код Java для кэширования данных, чтобы уменьшить количество соединений на стороне Java.

1 голос
/ 20 марта 2019

При использовании JPA / Hibernate вы должны установить DataSource, который часто является реализацией, использующей пул соединений, чтобы не нужно было воссоздавать соединения все время. Вместо этого будет использовано существующее соединение из пула соединений.

Существует несколько реализаций, доступных и поддерживаемых Spring, таких как HikariCP, DBCP, Tomcat и так далее. По умолчанию Spring boot 1.x использует пул соединений Tomcat, а Spring boot 2.x использует HikariCP .

Вы можете настроить минимальное количество незанятых соединений, установив свойство minimumIdle. По умолчанию это то же самое, что и maximumPoolSize, который в свою очередь по умолчанию равен 10. Это означает, что Hikari по умолчанию будет пытаться сохранить 10 соединений, либо незанятых, либо нет.

При загрузке Spring вы можете настроить свойства HikariCP с помощью префикса spring.datasource.hikari.*, например:

spring.datasource.hikari.minimumIdle=10
spring.datasource.hikari.maximumPoolSize=10

Цитирование соответствующей документации :

Это свойство контролирует минимальное количество незанятых соединений, которые HikariCP пытается поддерживать в пуле. Если число незанятых подключений падает ниже этого значения, а общее количество подключений в пуле меньше maximumPoolSize, HikariCP приложит все усилия для быстрого и эффективного добавления дополнительных соединений. Тем не менее, для максимальной производительности и реагирования на пиковые требования, мы рекомендуем не устанавливать это значение и вместо этого разрешать HikariCP действовать как пул соединений фиксированного размера. По умолчанию: так же, как maximumPoolSize

Как вы можете видеть, рекомендуется не изменять это поведение, и поэтому вполне нормально, если вы используете HikariCP, чтобы увидеть множество незанятых соединений, если ваши приложения не используются. Однако каждое приложение должно принимать не более 10 соединений, если не настроено иначе. Они также рекомендуют поддерживать максимальный размер пула как можно ниже, как указано в статье О размере пула .

Кроме того, вы можете настроить длительность соединения в режиме ожидания, настроив параметр idleTimeout.

...