Ошибка в подключении 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 шт):
Хотел бы оставить комментарий, но репутации не хватает , поэтому напишу в ответе.
- Проверь логи контейнера с mysql, возможно там будет ответ.
- Проверь сетевой доступ из бэкенд контейнера в mysql контейнер