【问题标题】:on AWS - could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet aws在 AWS 上 - 无法提取 ResultSet; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet aws
【发布时间】:2018-02-04 12:37:19
【问题描述】:

我的数据库访问存在这个(常见)问题。但就我而言,我找不到正确的答案...

创建了一个非常基本的 MySql DB 和访问它的 Spring Boot 应用程序。

在我的本地主机上运行流畅。

然后我转储了本地数据库。将其插入 AWS-MySql 数据库。 并将带有 Docker 的 Spring-Boot 应用程序部署到我的 EC2 上。 一切都很好。

但是在使用 AWS MySQL 时,所有 REST 端点都会返回: 状态 500 无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet

对我来说,它看起来就像在本地主机上一样。

我错过了什么?

【问题讨论】:

  • 我们需要更多详细信息来帮助您。数据库日志、应用程序日志、错误的全栈跟踪。我猜是执行权限有问题吗?
  • 是的,到现在我什么都没有。见回答...

标签: mysql hibernate amazon-web-services spring-boot amazon-rds


【解决方案1】:

我找到了原因。我知道一个解决方案。 但我不能接受不知道它是怎么发生的:

我的 POJO 仅由类名定义(没有 Table="" 元数据修饰)

在我的本地机器上运行良好。 SQL查询为:"... 'Dbname'.'tablename' ... "

在 RDS Mysql 上的 AWS 上 Dockerized。
SQL查询为:"... 'Dbname'.'TableName' ... "

然后当然查询失败了。

我的配置:

属性:

#Hibernate (Spring-JPA)
hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

POM:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud-services.version>1.5.0.RELEASE</spring-cloud-services.version>
        <spring-cloud.version>Dalston.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>io.pivotal.spring.cloud</groupId>
            <artifactId>spring-cloud-services-starter-service-registry</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>io.pivotal.spring.cloud</groupId>
                <artifactId>spring-cloud-services-dependencies</artifactId>
                <version>${spring-cloud-services.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

显然我的 NamingStrategy 设置将在本地或 aws 中被忽略或覆盖。

但此时我可能需要一些帮助。

PS:为什么我找不到任何关于 Hibernate 命名策略设置的有用文档?!?例如:strat-setting-A => TableName -> TABLE_NAME 等... 为什么我必须阅读代码才能理解这一点? (TT)

编辑: 万岁!我有原因。 我的本地数据库配置不同。好吧,默认情况下:lower_case_table_names=1 所以它只是忽略了 CamelCase。但在 aws 上,它似乎设置为 0 这意味着它会处理骆驼案例名称。

所以灵魂很简单:将我的命名策略设置为仅小写! 我在哪里可以找到配置正确的文档? :-)

无论如何……最好没有文档,然后是错误的文档!

解决方案:

2 个选项:

1 - 使用 @Table() 装饰器手动配置 POJO。 2 - 从属性中删除休眠命名设置(或将其更改为任何需要的内容)

PS:如果有人知道一个好的文档,我仍然对所有设置可能性感兴趣。

【讨论】:

  • 没有正确的配置。 hibernate 名称配置依赖于您传递给它的配置(注释表),或者它使用类名作为表的名称。此配置是特定于操作系统的,请在此处阅读:dev.mysql.com/doc/refman/5.7/en/… 你必须知道你必须知道你在使用什么,如果你没有定义表注释,你应该配置你的数据库忽略它。如果您使用注释,则此配置可以区分大小写或忽略它。
  • 哦,对于 Hibernate 文档,您没有正确搜索它。这里是 2.2.1.1 部分中的docs.jboss.org/hibernate/stable/annotations/reference/en/… 并注意休眠配置与 mysql 配置无关(尽管它们是相关的)您必须知道两者才能正确配置您的应用程序跨度>
  • 具体文本:如果没有定义@Table,则使用默认值:实体的非限定类名
  • 这就是为什么我说我们需要关于你的问题的更多细节。如果没有您在回答中提供的更多详细信息,在一百万年之内不会有人猜测您的申请出了什么问题。
  • @JorgeCampos 你的权利。我找到了一个 JBOSS 文档。但这是一个不同的(无用的)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2015-08-03
  • 2018-10-04
相关资源
最近更新 更多