Соединения с MariaDB закрываются автоматически при использовании Spring Boot и Hibernate? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть приложение Spring Boot, которое подключается к базе данных MariaDB, и оно работало нормально, пока я не осознал, что к базе данных были неуправляемые подключения.Зависимости управляются с помощью Maven.Я попытался войти в базу данных, используя $ mysql -u root -p, и мне сообщили, что существует слишком много соединений.У меня сложилось впечатление, что Spring Framework автоматически закрывает соединения с базой данных.Как Spring / Hibernate управляет подключениями к MariaDB?

Я пытался увеличить max_connections в mysql, однако я не могу войти в mysql из-за сообщения об ошибке «слишком много соединений».Большинство найденных решений требуют, чтобы вы сначала вошли в MySQL.

Я думаю, что проблема может быть в моем файле application.properties, где я указал spring.jpa.hibernate.ddl-auto в качестве проверки.Я сделал это так, чтобы Hibernate не изменил SQL для создания моих таблиц.Возможно, использование create-drop решит проблему?

Соответствующие зависимости из pom.xml:

    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.1.9</version>
        </dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-search-engine</artifactId>
            <version>5.6.1.Final</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jboss.logging</groupId>
                    <artifactId>jboss-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-search-orm -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-search-orm</artifactId>
            <version>5.6.1.Final</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jboss.logging</groupId>
                    <artifactId>jboss-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

из application.properties:

spring.datasource.username=root
spring.datasource.password=example-password

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1
# ===============================
# = JPA / HIBERNATE
# ===============================
# Show or not log for each sql query
spring.jpa.show-sql=true
# Hibernate ddl auto (create, create-drop, update): with "create-drop" the database
# schema will be automatically created afresh for every start of application
spring.jpa.hibernate.ddl-auto=validate
# Naming strategy
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
# Allows Hibernate to generate SQL optimized for a particular DBMS
<<<<<<< HEAD
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
=======
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
>>>>>>> 353345d141a2f83e8155574a9c8bbc04805ee1ee

Я получил сообщение об ошибке: «Слишком много соединений», когдапытаясь войти на сервер MySQL.

Точно так же, если я пытаюсь запустить приложение сейчас, используя Maven, я получаю:

Невозможно построить Hibernate SessionFactory;вложенное исключение: org.hibernate.exception.GenericJDBCException: невозможно открыть соединение JDBC для выполнения DDL: слишком много подключений

1 Ответ

0 голосов
/ 07 июня 2019

Если вы открываете сеанс для базы данных в каждом запросе, вы должны закрыть его самостоятельно после завершения транзакции, как показано ниже.

Session mSession = mSessionFactory.openSession();

...

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