无效的操作:关系“ information_schema.sequences”不存在(SpringBoot + RedShift)

时间:2019-11-19 08:59:41

标签: hibernate spring-boot spring-data-jpa amazon-redshift persistence

我正在尝试在Spring Boot应用程序中与Redshift Database建立连接。我的属性文件中有以下条目。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>EasyHTTP Example</title>
</head>
<body>
  <h1>EasyHTTP Example</h1>

  <script src="easy.js"></script>
  <script src="newapp.js"></script>
</body>
</html>

在pom.xml中,我有以下条目。

main.js?attr=7N7be5KFTB_XK1v3646uVIL17y569qG6DwMTgbv_iXZvqSna9AM-9MNlqFPvJklSwn76uz-fcLWPIOcuFrAZuA:988 Uncaught TypeError: ns.GetCommandSrc is not a function
    at GetCommandUrl (main.js?attr=7N7be5KFTB_XK1v3646uVIL17y569qG6DwMTgbv_iXZvqSna9AM-9MNlqFPvJklSwn76uz-fcLWPIOcuFrAZuA:988)
    at XMLHttpRequest.window.XMLHttpRequest.open (main.js?attr=7N7be5KFTB_XK1v3646uVIL17y569qG6DwMTgbv_iXZvqSna9AM-9MNlqFPvJklSwn76uz-fcLWPIOcuFrAZuA:1023)
    at easyHTTP.post (easy.js:13)
    at newapp.js:23

我已经创建了一个如下所示的POJO文件。

spring.datasource.driver-class-name=com.amazon.redshift.jdbc41.Driver
spring.datasource.url=jdbc:redshift://redshift_url/db_name
spring.datasource.username=username
spring.datasource.password=password

spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect =  org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true 
spring.jpa.properties.hibernate.current_session_context_class =org.springframework.orm.hibernate5.SpringSessionContext

但是,每当我启动应用程序时,我都会遇到错误。

<dependency>
  <groupId>com.amazon.redshift</groupId>
  <artifactId>redshift-jdbc41</artifactId>
  <version>1.2.10.1009</version>
</dependency>

请指导我解决此错误。

3 个答案:

答案 0 :(得分:0)

请勿将GenerationType.TABLE用于Redshift DWH,因为它将基于information_schema.sequences查询PostgreSQL9Dialect表,由于缺少序列支持,AWS Redshift不支持该表。如您所见,使用GenerationType.TABLE时执行的第一个查询将是:

SELECT tbl.next_val
FROM hibernate_sequences tbl
...

您可以尝试使用GenerationType.IDENTITY see Redshift CREATE TABLE doc代替您的ID(请参见下文),或者根本不使用GeneratedValues,因为Redshift不会强制执行主键...

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

答案 1 :(得分:0)

就像@aleksandar 提到的那样,Redshift 中不存在表 information_schema.sequences。

要跳过 information_schema.sequences,请创建覆盖现有 PostgreSqlDialect 的自定义方言

import org.hibernate.dialect.PostgreSQL9Dialect;

public class MyDialect extends PostgreSQL9Dialect {

    @Override
    public String getQuerySequencesString() {
        // Takes care of ERROR: relation “information_schema.sequences” does not exist
        return null;
    }
}

然后将hibernate.dialect设置为这个自定义方言类

spring.jpa.properties.hibernate.dialect =  <path to myDialect class>

答案 2 :(得分:-1)

如错误所指出,在Redshift中不存在表information_schema.sequences。尽管Redshift基于PostgreSQL,但仍有很多差异(https://docs.aws.amazon.com/redshift/latest/dg/c_redshift-and-postgres-sql.html

但是,Redshift专门设计为分析数据库,针对在大量数据上运行SELECT语句进行了优化,它不像许多写入/更新操作那样使其不适用于Spring Boot应用程序。我建议您为应用选择其他数据库类型,如果您使用AWS,则可以用于例如RDS