首页 > 解决方案 > 设置 Spring Boot Web 应用并将其与 MySQL 数据库链接

问题描述

我正在尝试启动链接到 MySQL 数据库的 Spring Boot Web 应用程序。该应用程序在与 MySQL 数据库容器位于同一网络中的 docker 容器上启动。我尝试使用容器名称作为 MySQL 的主机,但它导致了名称解析,所以我现在使用 docker 容器的私有 IP 地址进行连接。

这是applications.properties文件:

server.port=8081
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://172.88.0.0:3306/exampleDB
spring.datasource.username=exampleUser
spring.datasource.password=examplePassword
spring.jpa.properties.hibernate.default_schema=exampleDB
logging.level.root=WARN

Dockerfile

FROM openjdk:11.0.12
ADD target/launch.jar launch.jar
EXPOSE 8081
EXPOSE 80
COPY . .
ENTRYPOINT ["java","-jar", "launch.jar"]

docker-compose

version: "3.7"
networks:
  default:
    external: true
    name: test_network
services:
  java_web:
    container_name: java_app
    image: java_app
    build: .
    restart: on-failure
    volumes:
      - /usr/local/temp:/usr/local/temp
    ports:
      - "80:8081"

MySQL Dockerfile

FROM mysql:8.0.2

ENV MYSQL_DATABASE exampleDB
ENV MYSQL_ROOT_PASSWORD=examplePassword

COPY ./scripts/ /docker-entrypoint-initdb.d/

MySQLdocker-compose

version: "3.7"

networks:
  default:
    external: true
    name: test_network

services:
  mydb:
    ports:
      - "13306:3306"
    container_name: test_mydb
    environment:
      - MYSQL_ROOT_PASSWORD=examplePassword
    image: test_mysql

我收到一个java.io.EOFException: SSL peer shut down incorrectly错误:

java_bad_app |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
java_bad_app | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
java_bad_app |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
java_bad_app |   '  |____| .__|_| |_|_| |_\__, | / / / /
java_bad_app |  =========|_|==============|___/=/_/_/_/
java_bad_app |  :: Spring Boot ::                (v2.5.4)
java_bad_app |
java_bad_app | 2021-10-06 09:33:42.634 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
java_bad_app |
java_bad_app | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
java_bad_app |
java_bad_app | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
java_bad_app |  at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
java_bad_app |  at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:330) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.boot.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:184) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateDefaultDdlAutoProvider.getDefaultDdlAuto(HibernateDefaultDdlAutoProvider.java:42) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.lambda$getVendorProperties$1(HibernateJpaConfiguration.java:130) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings.getDdlAuto(HibernateSettings.java:41) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineDdlAuto(HibernateProperties.java:143) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.getAdditionalProperties(HibernateProperties.java:103) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineHibernateProperties(HibernateProperties.java:95) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.getVendorProperties(HibernateJpaConfiguration.java:132) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:132) ~[spring-boot-autoconfigure-2.5.4.jar!/:2.5.4]
java_bad_app |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
java_bad_app |  at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
java_bad_app |  at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.9.jar!/:5.3.9]
java_bad_app |  at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.4.jar!/:2.5.4]
java_bad_app |  at com.stackify.sandbox.SandboxApplication.main(SandboxApplication.java:12) ~[classes!/:0.0.1-SNAPSHOT]
java_bad_app |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
java_bad_app |  at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
java_bad_app |  at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[sandbox.jar:0.0.1-SNAPSHOT]
java_bad_app |  at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[sandbox.jar:0.0.1-SNAPSHOT]
java_bad_app |  at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[sandbox.jar:0.0.1-SNAPSHOT]
java_bad_app |  at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[sandbox.jar:0.0.1-SNAPSHOT]
java_bad_app | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
java_bad_app |
java_bad_app | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
java_bad_app |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
java_bad_app |  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
java_bad_app |  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
java_bad_app |  at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:317) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1352) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.NativeSession.connect(NativeSession.java:132) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:948) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:818) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  ... 56 common frames omitted
java_bad_app | Caused by: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.handleEOF(SSLSocketImpl.java:1616) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1434) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1336) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:450) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:421) ~[na:na]
java_bad_app |  at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:320) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:194) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:101) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:308) ~[mysql-connector-java-8.0.26.jar!/:8.0.26]
java_bad_app |  ... 61 common frames omitted
java_bad_app |  Suppressed: java.net.SocketException: Broken pipe (Write failed)
java_bad_app |          at java.base/java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:na]
java_bad_app |          at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110) ~[na:na]
java_bad_app |          at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150) ~[na:na]
java_bad_app |          at java.base/sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81) ~[na:na]
java_bad_app |          at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:380) ~[na:na]
java_bad_app |          at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:292) ~[na:na]
java_bad_app |          at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:462) ~[na:na]
java_bad_app |          ... 66 common frames omitted
java_bad_app | Caused by: java.io.EOFException: SSL peer shut down incorrectly
java_bad_app |  at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:483) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketInputRecord.readFully(SSLSocketInputRecord.java:461) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketInputRecord.decodeInputRecord(SSLSocketInputRecord.java:243) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:181) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111) ~[na:na]
java_bad_app |  at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1426) ~[na:na]
java_bad_app |  ... 68 common frames omitted```

Any help would be appreciated!

标签: javamysqlspringspring-bootdocker

解决方案


我认为您应该将您的 mysql 容器定义为 docker-compose.yml 中的服务。给你的容器起一个类似“mysql-app”的名字。您的 db 容器应该在 java 容器之后首先运行。顺便说一句,使用docker容器名称作为mysql主机名(spring.datasource.url=jdbc:mysql://mysql-app:3306/exampleDB)是正确的,不能有任何错误。


推荐阅读