Ошибка в подключении mysql к spring boot

Есть проект, состоит из 4 модулей(Spring boot 2.7.1, angular, mysql 8, keycloak) Все это прекрасно собирается через docker-compose и запускается, файл ниже

version: "3.9"

services:

  frontend: 
    build: SocialApp_frontend
    ports:
      - "4200:4200"

  backend: 
    build: SocialApp_backend
    depends_on:
      - mysql
      - keycloak
    ports:
      - "8090:8090"
    links: 
      - mysql
    volumes:
      - ./SocialApp_backend/uploads:/uploads

  keycloak: 
    build: Keycloak
    ports:
      - "8080:8080"
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: adminpass
  
  mysql:
    image: mysql:8.0.30
    ports: 
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: social_app
    volumes:
      - mysql-data:/var/lib/mysql
      - ./MySQL:/docker-entrypoint-initdb.d

volumes:
  mysql-data:

код конфигруации

#MySQL connection
spring.datasource.url=jdbc:mysql://mysql:3306/social_app?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

pom.xml

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

Я имею мало опыта и для практики хочу соединить эти 4 компонента на локальной машине. Я поднял кейлок, и фронт и mysql, там создана DATABASE social_app и установлены нужные пароли на рута. Но при запуске бека, бек не может установить связь с mysql Часть кода ошибки

2024-06-14 07:29:22.565  INFO 84986 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-06-14 07:29:23.569 ERROR 84986 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.25.jar:8.0.25]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na]

Что я пробовал сделать и проверял.

  • контейнеры с docker desktop в т.ч. mysql отключены, проверил и через десктоп и через строку, хоть mysql и был поднят на 3306 порту в докере тогда, но как мне кажется(НЕ УВЕРЕН), конфликта быть не должно
docker ps -a
CONTAINER ID   IMAGE                COMMAND                  CREATED        STATUS                      PORTS     NAMES
cba8feee7c07   socialapp-backend    "/usr/local/bin/mvn-…"   22 hours ago   Exited (143) 20 hours ago             socialapp-backend-1
c8eb5a0210a6   socialapp-keycloak   "/opt/keycloak/bin/k…"   22 hours ago   Exited (143) 20 hours ago             socialapp-keycloak-1
911fa232e58d   socialapp-frontend   "docker-entrypoint.s…"   22 hours ago   Exited (1) 20 hours ago               socialapp-frontend-1
6ca44c31f750   mysql:8.0.30         "docker-entrypoint.s…"   22 hours ago   Exited (0) 20 hours ago               socialapp-mysql-1
  • драйвер для БД Maven: mysql:mysql-connector-java:8.0.25 присутствует в библиотеках в структуре проекта
  • сама по себе БД рабочая и во время запуска бека я уже в нее зашёл и (тестировал оба варианта) - просто была активна БД socialapp или я создал в ней все нужные таблицы для приложения через sql скрипт, что изначально была в sql-модуле в приложении и создавался при поднятии mysql в контейнере, как я понимаю.
  • также подтверждение, что база работает корректно в том, что я могу подключиться к ней через граф интерфейс idea и коннекшен устанавливается
  • пробовал менять в конфигурации строку spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect на 8 диалект spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect - такая же ошибка, как вначале, нет коннекта.
  • пробовал в pom.xml добавить чисто конкретные версии, как <version>8.0.25</version> так и <version>5.1.47</version> - ошибка не уходит, с 5ой версией бек вообще не поднимается с ошибкой, что невозможно запустить томкат
2024-06-14 09:08:44.641 ERROR 89015 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:165) ~[spring-boot-2.7.1.jar:2.7.1]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577) ~[spring-context-5.3.21.jar:5.3.21]
///так далее

С 8 версией коннектора - поднимается.

  • также я добавил доп свойства в моей конфиг файл spring.datasource.url=jdbc:mysql://mysql:3306/social_app?serverTimezone=UTC&allowPublicKeyRetrieval=true&autoReconnect=true&useSSL=false при подъеме бек пытается коннектить, но падает в другой ошибкой
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-java-8.0.30.jar:8.0.30]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.30.jar:8.0.30]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.30.jar:8.0.30]

Вообще сумбурно, но я не понимаю логики связывания модулей приложения. В модуле sql сейчас только 1 файл sql с изначальным созданием таблиц. Обычно, создание sql запросов происходит в бекенд модуле в папке resources/db, ссылку туда прописываешь в .properties файле конфигруации. Полагаю сейчас в отдельном модуле лежит скрипт лишь для того, чтоб докер компос его запускал при старте контейнера?

Подскажите верную конфигурацию - куда положить файл с созданием БД и в чем может быть проблема с отсутствием подключение к mysql Очень надеюсь на помощь - 2ые сутки сижу с проблемой...


Ответы (1 шт):

Автор решения: Nikita Balilyi

Хотел бы оставить комментарий, но репутации не хватает , поэтому напишу в ответе.

  1. Проверь логи контейнера с mysql, возможно там будет ответ.
  2. Проверь сетевой доступ из бэкенд контейнера в mysql контейнер
→ Ссылка