【问题标题】:Spring boot datasource is down with exceptionSpring Boot 数据源异常关闭
【发布时间】:2014-07-28 18:55:46
【问题描述】:

我已经在 /health 下设置了 spring boot 以显示数据源状态。但是,我得到了这个 JSON:

"dataSource" : {
   "status" : "DOWN",
   "database" : "MySQL",
   "error" : "org.springframework.dao.TransientDataAccessResourceException: StatementCallback; SQL [SELECT 1]; Conversion not supported for type java.lang.Object; nested exception is java.sql.SQLException: Conversion not supported for type java.lang.Object"
},

如您所见,我的数据库是 mysql,我在 Windows8 上运行它。我确实尝试了“选择 1”查询,它确实在 mysql 的命令行中返回了 1。知道问题出在哪里吗?

【问题讨论】:

  • 它适用于我的 MySQL 5.6.19、mysql-connector-java:5.1.31 和 Spring Boot 1.1.4.RELEASE。不过,这是在 Mac OS X 上。您使用的是所涉及的各种组件的哪些版本?
  • 嗨,我刚刚尝试在 linux mint 上使用 mysql 5.5.37、mysql-connector-java 5.1.31 和 spring boot 版本 1.1.4.RELEASE,但它失败并出现同样的错误。我会尝试更新mysql并在这里发布结果。
  • 嗨,我在 Windows 8 上为 Win64 使用 spring boot 1.1.4.RELEASE 和 MySQL 5.7.2-m12 时遇到了同样的问题。一切正常,但运行状况显示这个奇怪的错误..: )也许我们需要健康来检查健康是否有效? :)))
  • 很有趣,谢谢。还要考虑两个变量:您使用的是什么版本的 Java 以及您使用的是哪个连接池?
  • 嗨,Andy,我的 java 是 1.7.0_40,连接池是 HikariCP

标签: mysql spring spring-boot


【解决方案1】:

DataSourceHealthIndicator 通过调用JdbcTemplate 运行其配置的查询(默认为SELECT 1):

this.jdbcTemplate.queryForObject(query, Object.class)

在 Java 6 上,这最终会导致调用 ResultSet.getObject(index) 并且事情会按预期工作。在 Java 7 上,调用是对 ResultSet.getObject(index, Object.class) 的调用(getObject 的这种重载在 Java 7 中是新的)。在其默认配置中,MySQL JDBC 驱动程序无法创建并返回 java.lang.Object 的实例,因此它会引发问题中描述的异常。

您可以通过启用自动反序列化来更改 MySQL 的行为并让它返回适合该列的任何实例:

spring.datasource.url: jdbc:mysql://localhost/test?autoDeserialize=true

我还打开了Spring boot issue,以便我们可以进行更改,从而无需启用自动反序列化。

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 2020-01-21
    • 2019-05-05
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多