Доступ к AWS Athena через весеннюю загрузку JPA

Я пытаюсь использовать AWS Athena, используя источник данных spring boot jpa. Я попытался настроить источник данных с заданными свойствами.

    spring.datasource.driver-class-name=com.amazonaws.athena.jdbc.AthenaDriver
    spring.datasource.url=jdbc:awsathena://athena.us-east-1.amazonaws.com:443/default
    spring.datasource.username=*****
    spring.datasource.password=***
    spring.datasource.tomcat.connectionProperties=s3_staging_dir=*****

Я получаю исключение ниже

    Caused by:org.springframework.beans.BeanInstantiationException:    Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is java.lang.IllegalArgumentException: URL must start with 'jdbc'
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(Constructo`enter code here`rResolver.java:588) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
... 51 common frames omitted
    Caused by: java.lang.IllegalArgumentException: URL must start with 'jdbc'
at org.springframework.util.Assert.isTrue(Assert.java:92) ~[spring-core-4.3.7.RELEASE.jar:4.3.7.RELEASE]
at org.springframework.boot.jdbc.DatabaseDriver.fromJdbcUrl(DatabaseDriver.java:268) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.autoconfigure.orm.jpa.DatabaseLookup.getDatabase(DatabaseLookup.java:73) ~[spring-boot-autoconfigure-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.determineDatabase(JpaProperties.java:139) ~[spring-boot-autoconfigure-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.jpaVendorAdapter(JpaBaseConfiguration.java:105) ~[spring-boot-autoconfigure-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$720f8624.CGLIB$jpaVendorAdapter$4(<generated>) ~[spring-boot-autoconfigure-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$720f8624$$FastClassBySpringCGLIB$$9766cf.invoke(<generated>) ~[spring-boot-autoconfigure-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.7.RELEASE.jar:4.3.7.RELEASE] 

person Saurabh Sharma    schedule 29.03.2017    source источник
comment
То же самое, я вообще не мог его использовать, даже с Хикари.   -  person Diego Magalhães    schedule 10.04.2017
comment
Драйвер afaik athena jdbc подходит только для использования клиентов sql. время от времени я пытался реализовать javax.sql.DataSource с помощью драйвера athena jdbc, но он не реализуется и, следовательно, не поддерживает подготовленные операторы.   -  person px5x2    schedule 12.05.2018
comment
Вы пытались настроить ванильный JdbcTemplate для URL-адреса Athena JDBC?   -  person Kevin Hooke    schedule 06.03.2019
comment
Я пытался сделать то же самое. JPA не работает, но использование JdbcTemplate работает нормально.   -  person JabariP    schedule 07.03.2019
comment
Вы пытались использовать двойные или одинарные кавычки вокруг строки URL?   -  person abdullahkhawer    schedule 21.08.2019
comment
удалить / по умолчанию в URL   -  person vaquar khan    schedule 23.08.2019


Ответы (3)


По умолчанию Spring boot автоматически определяет, какой Hibernate Диалект для использования на основе метаданных источника данных, полученных из драйвера JDBC.

Эта ошибка возникает из-за того, что драйвер Athena JDBC не может получить соответствующие метаданные. Не уверен, почему это не удается, но вы можете обойти это обнаружение и явно объявить, какой диалект Hibernate использовать самостоятельно, объявив JpaVendorAdapter bean :

@Bean
public JpaVendorAdapter jpaVendorAdapter(JpaProperties properties) {
    AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setShowSql(properties.isShowSql());
    adapter.setGenerateDdl(properties.isGenerateDdl());
    return adapter;
}

Я сохраняю поведение по умолчанию, но отключаю автоматическое определение диалекта

И определите диалект в application.properties:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.XXXXXX

Но дело в том, что я сомневаюсь, можно ли использовать Athena с Hibernate, поскольку я не могу найти существующий диалект для Athena. Итак, что я предлагаю:

  1. Попробуйте диалект из другой базы данных, синтаксис SQL которой похож на Athena. Неудивительно, что он не будет работать в некоторых случаях.

  2. Реализуйте диалект для Афины самостоятельно.

person Ken Chan    schedule 23.08.2019

В ответ на ответы, представленные здесь (я не могу комментировать из-за репутации), а также из-за того, что в Интернете нет рабочего примера, я расскажу, как мне удалось настроить данные JPA spring boot(2.2.5) использовать драйвер Athena JDBC.

URL-адрес подключения Athena jdbc имеет формат
jdbc:awsathena://athena.[Region].amazonaws.com:443;User= [AccessKey];Password=[SecretKey];S3OutputLocation=[Output];

Мой файл apps.properties
spring.datasource.url=specifiedformat
spring.datasource.driver-class-name=com.simba.athena.jdbc42.Driver
spring.datasource.hikari.connection-test-query=SELECT 1
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=validate

Драйвер JDBC для Athena можно найти здесь
https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html
Или, если вы хотите использовать репозиторий maven
https://mvnrepository.com/artifact/com.syncron.amazonaws/simba-athena-jdbc-driver/2.0.2

Я использовал MySQLDialect, потому что он похож на ANSI SQL, используемый Athena (в настоящее время диалект для Athena не существует). Конечно, из-за диалекта MySQL и того факта, что Athena не поддерживает подготовленные операторы (на самом деле только те, у которых есть заполнитель ?, вы можете использовать String.format(), чтобы обойти это, ref: AWS Athena JDBC PreparedStatement), вы не сможете выполнять все операции, реализованные jpa по умолчанию с данными весенней загрузки, но вы можете обойти это, используя аннотации @Query внутри вашего классы репозитория и String.format() для обхода неподдерживаемых подготовленных операторов.

Драйвер Spring boot + JPA + Hibernate + Athena JDBC отлично работает для меня (в настоящее время я только читаю данные), единственная проблема заключается в том, что вам нужно тестировать каждый из ваших запросов, если он поддерживается в этой конфигурации (поскольку они могут генерировать исключения для неподдерживаемых операций ).

person Norbert Dopjera    schedule 03.04.2020
comment
не могли бы вы опубликовать несколько примеров того, как вы используете аннотации @Query внутри классов репозитория и String.format() для обхода неподдерживаемых подготовленных операторов? - person Cosmin; 05.05.2021

В документации AWS Athena указано, что порт 444 должен быть открыт для исходящего трафика. Согласно документации по подключению здесь https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html

Не уверен, что это правильное решение, поэтому я немного покопался, так как этот вопрос такой старый.

person Michael Quale    schedule 22.08.2019