我有一个用于带有 Hibernate 和 MySQL 8 服务器的 SpringBoot 应用程序的 docker-compose。但是每当 docker-compose 启动我的 MySQL 服务器和 SpringBoot 应用程序时,我都会得到:
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
我已经验证了以下内容:
- MySQL 在 SpringBoot 应用程序启动之前启动
- 尝试使用 -links,但没有成功
- 没有任何内容使用端口 3307
- 我可以使用
/bin/mysql -h0.0.0.0 -uroot -ppassword
完美连接到 localhost:3307 - 让它们位于同一网络
- 重新启动 Docker
- 通过在服务器上运行
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
来确保root用户拥有权限 - 使用单独的 DockerFile 运行
- 拥有正确的 mysql 连接器和 Hibernate 依赖项
但是我上面尝试过的所有方法都不起作用。
*奇怪的是,如果我在不使用 Docker 的情况下自行启动应用程序(仅使用 IntelliJ 的 SpringBoot 配置),我的 SpringBoot 应用程序能够连接到 mysql 数据库)
我不知道我做错了什么。请帮忙^
最佳答案
您在主机端口 3307 上公开了数据库容器的端口 3306。但是,容器端口仍然是 3306。因此,当您连接到数据库容器时,应该连接到端口 3306
如果您想从运行数据库容器的主机连接到数据库容器,请使用 localhost:3307。但这对于主机上运行的容器不起作用。对于这些,请使用容器:3306。
关于mysql - 在 docker-compose 中使用 MySQL 初始化 Hibernate 时连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60498376/