对无法连接到 MySQL 的 Spring Boot 应用程序进行故障排除

Posted

技术标签:

【中文标题】对无法连接到 MySQL 的 Spring Boot 应用程序进行故障排除【英文标题】:Troubleshooting Spring Boot app that won't connect to MySQL 【发布时间】:2017-05-06 17:42:30 【问题描述】:

我在应用程序中构建了 mysql 连接器和数据库详细信息,但在 Tomcat 中运行时它仍然无法连接到 MySQL。我的应用完全开源,所有源代码都在网上:https://github.com/clickcell/AutomationStatisticsPortal

The application.class

The gradle build file

application.properties 文件,与我的存储库不同,是​​:

spring.datasource.url=jdbc:mysql://localhost/springboot
spring.datasource.username=newuser
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

我尝试设置 MySQL 5.5 服务器以匹配 application.properties

每次症状如下:

Web 应用程序正在运行,但没有数据库连接,没有数据显示。

我使用 Tomcat8 和 MySQL 5.5。我已启用查询日志并使用tail -f 对其进行监视,当我直接向服务器运行查询时,它们会显示在日志中,但是当我在 tomcat 管理器中重新启动我的应用程序时,该日志中没有任何显示。

在 tomcat 日志中我得到以下信息:

21-Dec-2016 10:19:16.693 INFO [http-nio-8080-exec-6] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/AutomationStatisticsPortal] has started
21-Dec-2016 10:19:17.339 WARNING [http-nio-8080-exec-6] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [AutomationStatisticsPortal] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
21-Dec-2016 10:19:19.026 INFO [http-nio-8080-exec-6] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
21-Dec-2016 10:19:26.839 INFO [http-nio-8080-exec-6] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/AutomationStatisticsPortal] is completed

看起来它注册了错误类型的数据库驱动程序,但我不知道为什么给定我的配置。

【问题讨论】:

您是否遇到了一些错误?异常和堆栈跟踪会很有帮助。 没有堆栈跟踪,我查看了tomcat8-stderr.*,但在我的编辑中确实找到了一些有用的消息。 “没有数据显示”是什么意思。哪里没有数据显示? 感谢@ChristopherSchultz,我有this bootstrap class 将初始数据加载到数据库中,然后当我加载页面时它应该显示在浏览器中。它没有进入数据库,所以我的网站只显示带有样式且没有数据的空白页面。这是与 H2 数据库一起开发的,所以我知道页面在生产中工作时会是什么样子。 【参考方案1】:

您显示的日志是使用H2时产生的。

我克隆了您的存储库并在本地进行了测试,当我使用 MySQL 参数更新 src/main/resources/application.properties 时它可以工作。 您应该删除根目录中的另一个,它是模棱两可的。

您也可以将src/main/resources 中的application.properties 文件替换为application.yml 文件:

spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        url: jdbc:mysql://localhost/springboot
        username: newuser
        password: password
    jpa:
      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
      database: MYSQL
      show-sql: true

在这种情况下,添加 Hikary 依赖项,或使用其他数据源类型。

【讨论】:

谢谢,我尝试进行更改,但应用程序无法在 tomcat 中启动,我收到错误 At least one JAR was scanned for TLDs yet contained no TLDs. 这是一个INFO,你可以忽略它。如果要使用 Hikary 版本,请确保包含依赖项:mvnrepository.com/artifact/com.zaxxer/HikariCP/2.5.1。但是您可以坚持使用默认值。如果您授予对 pblanchardie 的写入权限,我可以将 application.properties 推送到 GitHub。 我添加了依赖项,现在我可以确认查询正在到达 MySQL 服务器,但我看到它们被回滚,并且我的应用程序无法启动。我不断收到此错误:SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive AutomationStatisticsPortal.war java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/AutomationStatisticsPortal]] @clickcell 您需要查看其他日志文件以找出您的应用程序无法启动的原因。这不会进入catalina.out 管理器日志中堆栈跟踪的底部有Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'springboot.record_type' doesn't exist

以上是关于对无法连接到 MySQL 的 Spring Boot 应用程序进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL

无法使用 JDBC 和 Spring 连接到 MySQL [重复]

Spring boot JDBC无法连接到docker容器中的mysql

Spring Boot无法连接到同一网络的docker中的mysql

Docker 上的 Spring Boot 无法连接到 MySQL

Docker MySQL - 无法从 Spring Boot 应用程序连接到 MySQL 数据库