Может ли Spring Batch работать с Amazon Redshift? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать Spring Batch (4.0.1.RELEASE) для работы с Amazon Redshift.Я прошел через первую серьезную проблему с отсутствием поддержки Redshift для последовательностей здесь .

Однако теперь я столкнулся с этим, когда я пытаюсь запустить задание:

10:57:07.122 ERROR [http-nio-8080-exec-4 ] [JobLaunchingService] [] Could not start job [demoJob]
org.springframework.dao.InvalidDataAccessApiUsageException: PreparedStatementCallback; SQL [INSERT INTO BATCH_JOB_EXECUTION_CONTEXT (SHORT_CONTEXT, SERIALIZED_CONTEXT, JOB_EXECUTION_ID) VALUES(?, ?, ?)[Amazon][JDBC](10220) Driver does not support this optional feature.; nested exception is java.sql.SQLFeatureNotSupportedException: [Amazon][JDBC](10220) Driver does not support this optional feature.

Это с драйвером JDBC Redshift 1.2.16.1027.

Можно ли использовать Redshift в качестве базы данных пакета?Любые предложения о том, как обойти это?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Чтобы сделать это, мне пришлось определить отдельную базу данных MySQL для «контрольных» таблиц Spring Batch.Это была база данных по умолчанию (@Primary) в пакетном приложении.ItemWriter s снабжаются другой DataSource, той, которая была указана на Redshift.

Так что теперь у меня есть DataSource для таблиц Batch, одна для моего исходного db, иодин для целевого дБ.Кажется, это работает, но я использую только стандарт DataSourceTransactionManager, так что мне совершенно не ясно, каковы границы транзакций, если происходит сбой шага, выполняется ли откат базы данных таким же образом.Но я НЕ собираюсь использовать XA !!

0 голосов
/ 20 декабря 2018

Amazon Redshift не поддерживается базой данных для Spring Batch.Поддерживаемые базы данных перечислены здесь: https://github.com/spring-projects/spring-batch/tree/master/spring-batch-core/src/main/resources/org/springframework/batch/core.

0 голосов
/ 20 декабря 2018

Я не уверен насчет вашего варианта использования, если есть ограничение или ограничение, что вам нужно иметь только Spring партию.Кроме того, драйвер jdbc говорит: Он не поддерживает пакет. , тогда я считаю, что нет способа заставить его работать.В качестве рекомендуемого подхода и передового опыта в Redshift вместо insert statement должна использоваться команда COPY.Тем не менее, вы могли бы вызвать команду copy, используя простой JDBC. Это может быть хорошей идеей.

Вы можете взглянуть на один мой ответ , который я предоставил ранее.Я просто копирую / вставляю это, чтобы было удобно.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;

public class RedShiftJDBC {
public static void main(String[] args) {

Connection conn = null;
Statement statement = null;
try {
//Make sure to choose appropriate Redshift Jdbc driver and its jar in classpath
Class.forName("com.amazon.redshift.jdbc42.Driver");
Properties props = new Properties();
props.setProperty("user", "username***");
props.setProperty("password", "password****");

System.out.println("\n\nconnecting to database...\n\n");
//In case you are using postgreSQL jdbc driver.

conn = DriverManager.getConnection("jdbc:redshift://********url-to-redshift.redshift.amazonaws.com:5439/example-database", props);

System.out.println("\n\nConnection made!\n\n");

statement = conn.createStatement();

String command = "COPY my_table from 's3://path/to/csv/example.csv' CREDENTIALS 'aws_access_key_id=******;aws_secret_access_key=********' CSV DELIMITER ',' ignoreheader 1";

System.out.println("\n\nExecuting...\n\n");

statement.executeUpdate(command);
//you must need to commit, if you realy want to have data copied.
conn.commit();
System.out.println("\n\nThats all copy using simple JDBC.\n\n");
statement.close();
conn.close();
 } catch (Exception ex) {    ex.printStackTrace();   }  } }

Надеюсь, это даст вам некоторое представление.Если у вас есть конкретный вопрос, добавьте комментарий, я смогу перефокусировать ответ.

...