Отказ в соединении при инициализации Hibernate с MySQL in docker -compose - PullRequest
1 голос
/ 03 марта 2020

У меня есть docker -композиция для приложения SpringBoot с Hibernate и MySQL 8 сервером. Но всякий раз, когда мой MySQL сервер и приложение SpringBoot запускаются docker -compose, я получаю:

HHH000342: Could not obtain connection to query metadata : Communications link failure
...
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
...
Caused by: java.net.ConnectException: Connection refused

И вот мой docker -compose.yaml:

version: '3'
services:
  my-account-microservice-db:
    container_name: my-account-microservice-db
    volumes:
      - /Users/syu/Desktop/my-mysql/storage/my-account-microservice-db:/var/lib/mysql
    image: mysql:8.0.19
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: my-account
    ports:
      - "3307:3306"
    networks:
      - my-network

  my-account-microservice:
    container_name: my-account-microservice
    image: my-account-microservice
    build:
      context: ./account-microservice
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://my-account-microservice-db:3307/my-account
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: password
      SPRING_DATASOURCE_DRIVER-CLASS-NAME: com.mysql.cj.jdbc.Driver
      # SPRING.DATASOURCE.URL: jdbc:mysql://my-account-microservice-db:3307/my-account
      # SPRING.DATASOURCE.USERNAME: root
      # SPRING.DATASOURCE.PASSWORD: password
      # SPRING.DATASOURCE.DRIVER-CLASS-NAME: com.mysql.cj.jdbc.Driver
      # DATABASE_HOST: my-account-microservice-db
      # DATABASE_USER: root
      # DATABASE_PASSWORD: password
      # DATABASE_PORT: 3307
    depends_on:
      - my-account-microservice-db
    ports:
      - "8090:8090"
    networks:
      - my-network
#    links:
#      - my-account-microservice-db:database

networks:
  my-network:

И мои application.properties:

spring.application.name=account-microservice

server.port=8090

# ==============================================================
# = Data Source
# ==============================================================
# ******** Will probably put this on a central config server? would that work?
spring.datasource.url = jdbc:mysql://localhost:3307/my-account
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver

# ==============================================================
# = Show or not log for each sql query
# ==============================================================
spring.jpa.show-sql = true

# ==============================================================
# = Keep the connection alive if idle for a long time (needed in production)
# ==============================================================
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# ==============================================================
# = Hibernate ddl auto (create, create-drop, update)
# = The SQL dialect makes Hibernate generate better SQL for the chosen database
# ==============================================================
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl = true
spring.jpa.hibernate.ddl-auto = update

Я проверил следующие вещи:

  1. MySQL до запуска приложения SpringBoot
  2. Пробовал использовать -links, но не работал
  3. Ничто не использует порт 3307
  4. Я могу подключиться к localhost: 3307 с /bin/mysql -h0.0.0.0 -uroot -ppassword прекрасно
  5. Наличие их в одной сети
  6. Перезапуск Docker
  7. Убедитесь, что root пользователь имеет привилегии, запустив GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' на сервере
  8. Запустив с отдельными DockerFiles
  9. Наличие правильного mysql коннектора и зависимостей Hibernate


Но все, что я пробовал выше, не сработало.

* Странно то, что мое приложение SpringBoot может подключать к базе данных mysql, если я просто запускаю приложение без использования Docker (просто с помощью SpringBoot IntelliJ) config)

Понятия не имею, что я делаю не так. Пожалуйста, помогите ^

1 Ответ

1 голос
/ 03 марта 2020

Вы открываете порт 3306 контейнера базы данных на хост-порту 3307. Однако порт контейнера все еще 3306. Поэтому при подключении к контейнеру базы данных следует подключиться к порту 3306

Если Если вы хотите подключиться к контейнеру базы данных с хоста, на котором вы его запускаете, используйте localhost: 3307. Это не будет работать для контейнеров, работающих на вашем хосте. Для них используйте контейнер: 3306.

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