首页 > 解决方案 > 无法将 Java/Tomcat 应用程序连接到 Docker/MySQL

问题描述

似乎无法让我的 Tomcat 连接到我的 Docker 容器。

日志在堆栈跟踪的根部吐出以下内容:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2095)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2020)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:367)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:196)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
    ... 176 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.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 sun.reflect.GeneratedConstructorAccessor66.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2036)
    ... 192 more
Caused by: java.net.UnknownHostException: mysql
    at java.net.InetAddress.getAllByName0(InetAddress.java:1280)
    at java.net.InetAddress.getAllByName(InetAddress.java:1192)
    at java.net.InetAddress.getAllByName(InetAddress.java:1126)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:299)
    ... 194 more

设置:

配置:

database.jdbcUrl=jdbc:mysql://internal-mysql:3307/app_main?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&sendFractionalSeconds=false&useSSL=false&rewriteBatchedStatements=true

码头工人-compose.yml:

  mysql:
    restart: always
    image: "percona:5.7"
    ports:
      - "3307:3307"
    environment:
      MYSQL_USER: root
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/conf:/etc/mysql:ro
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d:rw
    healthcheck:
      test: ["CMD-SHELL", "mysqlshow --host=127.0.0.1 --port 3307 --user=root--password=password app_main"]
      interval: 15s
      timeout: 1s
      retries: 5
      start_period: 30s
    networks:
      default:
        aliases:
          - internal-mysql

各种各样的:

编辑:我可以通过 HeidiSQL 或 Workbench 等独立程序完美地连接到 Docker/MySQL 容器internal-mysql:3307。因此,连接问题似乎仅存在于 Java 和/或 Tomcat 端,而不是容器。

标签: javamysqldockertomcatjdbc

解决方案


推荐阅读