JDBC

Компонент JDBC обеспечивает доступ к базам данных через JDBC, отправляя SQL-запросы (SELECT) и операции (INSERT, UPDATE и т. д.) в теле сообщения. Этот компонент использует стандартный JDBC API, в отличие от SQL-компонента (opens in a new tab) , который использует spring-jdbc.

* Если вы используете Spring и вам нужна поддержка Spring Transactions, используйте вместо этого компонента Spring JDBC .

Пользователям Maven необходимо добавить следующую зависимость для pom.xmlэтого компонента:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jdbc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

Этот компонент можно использовать только для определения конечных точек производителя, что означает, что вы не можете использовать компонент JDBC в from()операторе.

URI format

jdbc:dataSourceName[?options]

Configuring Options

Компоненты Camel настраиваются на двух отдельных уровнях:

  • уровень компонентов

  • уровень конечной точки

Configuring Component Options

На уровне компонентов задаются общие и общие конфигурации, которые затем наследуются конечными точками. Это самый высокий уровень конфигурации.

Например, компонент может иметь настройки безопасности, учетные данные для аутентификации, URL-адреса для сетевого подключения и т. д.

У некоторых компонентов всего несколько параметров, а у других -- много. Поскольку компоненты обычно имеют предустановленные значения по умолчанию, которые широко используются, зачастую вам может потребоваться настроить лишь несколько параметров компонента, а то и вовсе ни одного.

Вы можете настроить компоненты, используя:

  • Компонент DSL (opens in a new tab) .

  • в файле конфигурации ( application.propertiesфайлы *.yaml, и т.д.).

  • непосредственно в коде Java.

Configuring Endpoint Options

Настройка конечных точек обычно занимает больше времени, поскольку у них есть множество параметров. Эти параметры помогают вам настроить функции конечной точки. Параметры также классифицируются по тому, используется ли конечная точка как потребитель ( от ), как производитель ( от ) или и то, и другое.

Конечные точки чаще всего настраиваются непосредственно в URI конечной точки в виде параметров пути и запроса . Вы также можете использовать Endpoint DSL (opens in a new tab) и DataFormat DSL (opens in a new tab) в качестве типобезопасного способа настройки конечных точек и форматов данных в Java.

Хорошей практикой при настройке параметров является использование заполнителей свойств (opens in a new tab) .

Заполнители свойств обеспечивают несколько преимуществ:

  • Они помогают предотвратить использование жестко запрограммированных URL-адресов, номеров портов, конфиденциальной информации и других настроек.

  • Они позволяют вынести конфигурацию за пределы кода.

  • Они помогают коду стать более гибким и пригодным для повторного использования.

В следующих двух разделах перечислены все параметры, сначала для компонента, а затем для конечной точки.

Component Options

Компонент JDBC поддерживает 4 параметра, которые перечислены ниже.

dataSource (producer)

  • По умолчанию: Использовать экземпляр DataSource вместо поиска источника данных по имени в реестре.

  • По умолчанию: Тип: * DataSource

lazyStartProducer (producer)

  • Тип: Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

autowiredEnabled (advanced)

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: boolean

connectionStrategy (advanced)

  • Использовать пользовательскую стратегию для работы с соединениями. Не используйте пользовательскую стратегию при использовании компонента spring-jdbc, поскольку по умолчанию для поддержки Spring Transactions используется специальная стратегия Spring ConnectionStrategy.

  • По умолчанию:

  • Тип: ConnectionStrategy

Endpoint Options

Конечная точка JDBC настраивается с использованием синтаксиса URI:

jdbc:dataSourceName

Со следующими параметрами пути и запроса :

Path Parameters (1 parameters)

dataSourceName (producer)

  • Необходимое имя источника данных для поиска в реестре. Если имя -- dataSource или default, Camel попытается найти источник данных по умолчанию в реестре. Это означает, что если найден только один экземпляр DataSource, будет использован этот источник данных.

  • По умолчанию:

  • Тип: String

Query Parameters (14 parameters)

allowNamedParameters (producer)

  • Тип: Разрешить ли использование именованных параметров в запросах.

  • По умолчанию: true

  • Тип: boolean

outputClass (producer)

  • Укажите полное имя пакета и класса для использования в качестве преобразования, если outputType=SelectOne или SelectList.

  • По умолчанию:

  • Тип: String

outputType (producer)

  • Определяет, какой выходной продукт должен использовать производитель.

    Значения перечисления:

    • SelectOne

    • SelectList

    • StreamList

  • По умолчанию: SelectList

  • Тип: JdbcOutputType

parameters (producer)

  • Необязательные параметры для java.sql.Statement. Например, для установки maxRows, fetchSize и т. д. Это многозначный параметр с префиксом: statement.

  • По умолчанию:

  • Тип: Map

readSize (producer)

  • Максимальное количество строк, которое может быть прочитано опросным запросом (по умолчанию). Значение по умолчанию -- 0.

  • По умолчанию:

  • Тип: int

resetAutoCommit (producer)

  • Тип: Camel установит флаг autoCommit для JDBC-подключения в значение false, зафиксирует изменения после выполнения оператора и сбросит флаг autoCommit для соединения в конце, если resetAutoCommit имеет значение true. Если JDBC-подключение не поддерживает сброс флага autoCommit, можно установить флаг resetAutoCommit в значение false, и Camel не будет пытаться сбросить флаг autoCommit. При использовании с транзакциями XA вам, скорее всего, потребуется установить его в значение false, чтобы менеджер транзакций отвечал за фиксацию этой транзакции.

  • По умолчанию: true

  • Тип: boolean

transacted (producer)

  • Используются ли транзакции.

  • По умолчанию: false

  • Тип: boolean

useGetBytesForBlob (producer)

  • Для чтения столбцов BLOB как байтов, а не как строковых данных. Это может потребоваться для некоторых баз данных, таких как Oracle, где необходимо читать столбцы BLOB как байты.

  • По умолчанию: false

  • Тип: boolean

useHeadersAsParameters (producer)

  • Установите этот параметр в значение true, чтобы использовать prepareStatementStrategy с именованными параметрами. Это позволяет определять запросы с именованными плейсхолдерами и использовать заголовки с динамическими значениями для плейсхолдеров запросов.

  • По умолчанию: false

  • Тип: boolean

useJDBC4ColumnNameAndLabelSemantics (producer)

  • Устанавливает, использовать ли семантику JDBC 4, JDBC 3.0 или более ранней версии при получении имени столбца. JDBC 4.0 использует columnLabel для получения имени столбца, тогда как JDBC 3.0 использует и columnName, и columnLabel. К сожалению, драйверы JDBC ведут себя по-разному, поэтому вы можете использовать этот параметр для решения проблем с вашим драйвером JDBC, если у вас возникнут проблемы с этим компонентом. Этот параметр по умолчанию имеет значение true.

  • По умолчанию: true

  • Тип: boolean

lazyStartProducer (producer (advanced))

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

beanRowMapper (advanced)

  • Для использования пользовательского org.apache.camel.component.jdbc.BeanRowMapper при использовании outputClass. Реализация по умолчанию преобразует имена строк в строчные буквы и пропускает подчёркивания и дефисы. Например, CUST_ID отображается как custId.

  • По умолчанию:

  • Тип: BeanRowMapper

connectionStrategy (advanced)

  • Использовать пользовательскую стратегию для работы с соединениями. Не используйте пользовательскую стратегию при использовании компонента spring-jdbc, поскольку по умолчанию для поддержки Spring Transactions используется специальная стратегия Spring ConnectionStrategy.

  • По умолчанию:

  • Тип: ConnectionStrategy

prepareStatementStrategy (advanced)

  • Тип: Позволяет плагину использовать пользовательский org.apache.camel.component.jdbc.JdbcPrepareStatementStrategy для управления подготовкой запроса и подготовленного оператора.

  • По умолчанию:

  • Тип: JdbcPrepareStatementStrategy

Message Headers

Компонент JDBC поддерживает 8 заголовков сообщений, которые перечислены ниже:

CamelJdbcUpdateCount (producer)

Constant: JDBC_UPDATE_COUNT (opens in a new tab)

  • Если запрос является ОБНОВЛЕНИЕМ, количество обновлений запроса возвращается в этом заголовке OUT.

  • По умолчанию:

  • Тип: int

CamelJdbcRowCount (producer)

Constant: JDBC_ROW_COUNT (opens in a new tab)

  • Тип: Если запрос является SELECT, количество строк возвращается в этом заголовке OUT.

  • По умолчанию:

  • Тип: int

CamelJdbcColumnNames (producer)

Constant: JDBC_COLUMN_NAMES (opens in a new tab)

  • Имена столбцов из ResultSet как тип java.util.Set.

  • По умолчанию:

  • Тип: Set

CamelJdbcParameters (producer)

Constant: JDBC_PARAMETERS (opens in a new tab)

  • Тип: Java.util.Map, содержащий заголовки, которые будут использоваться, если включено useHeadersAsParameters.

  • По умолчанию:

  • Тип: Map

CamelRetrieveGeneratedKeys (producer)

Constant: JDBC_RETRIEVE_GENERATED_KEYS (opens in a new tab)

  • Установите значение true, чтобы получить сгенерированные ключи.

  • По умолчанию: false

  • Тип: Boolean

CamelGeneratedColumns (producer)

Constant: JDBC_GENERATED_COLUMNS (opens in a new tab)

  • Установите его, чтобы указать ожидаемые сгенерированные столбцы

  • По умолчанию:

  • Тип: String[] or int[]

CamelGeneratedKeysRowCount (producer)

Constant: JDBC_GENERATED_KEYS_ROW_COUNT (opens in a new tab)

  • Количество строк в заголовке, содержащих сгенерированные ключи.

  • По умолчанию:

  • Тип: int

CamelGeneratedKeysRows (producer)

Constant: JDBC_GENERATED_KEYS_DATA (opens in a new tab)

  • Тип: Строки, содержащие сгенерированные ключи.

  • По умолчанию:

  • Тип: List

Usage

Result

По умолчанию результат возвращается в теле OUT в виде объекта ArrayList<HashMap<String, Object>>. ListОбъект содержит список строк, а Mapобъекты содержат каждую строку с Stringключом в качестве имени столбца. Вы можете использовать этот параметр outputTypeдля управления результатом.

Примечание: этот компонент извлекается ResultSetMetaData, чтобы иметь возможность вернуть имя столбца в качестве ключа в Map

Generated keys

Если вы вставляете данные с помощью SQL INSERT, то СУБД может поддерживать автоматическую генерацию ключей. Вы можете указать поставщику JDBC (opens in a new tab) возвращать сгенерированные ключи в заголовках.

Для этого установите заголовок CamelRetrieveGeneratedKeys=true. Тогда сгенерированные ключи будут предоставлены в виде заголовков с ключами, указанными в таблице выше.

Использование сгенерированных ключей не работает вместе с именованными параметрами.

Using named parameters

В приведённом ниже маршруте мы хотим получить все проекты из projectsтаблицы. Обратите внимание, что SQL-запрос содержит два именованных параметра, :?licи :?min. Затем Camel найдёт эти параметры в заголовках сообщения. Обратите внимание, что в примере выше мы задаём два заголовка с постоянными значениями для именованных параметров:

  from("direct:projects")
     .setHeader("lic", constant("ASF"))
     .setHeader("min", constant(123))
     .setBody("select * from projects where license = :?lic and id > :?min order by id")
     .to("jdbc:myDataSource?useHeadersAsParameters=true")

Вы также можете сохранить значения заголовков в java.util.Mapи сохранить карту заголовков с помощью ключа CamelJdbcParameters.

Examples

В следующем примере мы настраиваем источник данных, необходимый для Camel-jdbc. Сначала мы регистрируем наш источник данных в реестре Camel как testdb:

EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
      .setType(EmbeddedDatabaseType.DERBY).addScript("sql/init.sql").build();

CamelContext context = ...
context.getRegistry().bind("testdb", db);

Затем мы настраиваем маршрут к компоненту JDBC, чтобы SQL-запрос был выполнен. Обратите внимание, как мы ссылаемся на testdbисточник данных, привязанный на предыдущем шаге:

from("direct:hello")
    .to("jdbc:testdb");

Мы создаём конечную точку, добавляем SQL-запрос в тело сообщения IN, а затем отправляем обмен. Результат запроса возвращается в теле OUT :

Endpoint endpoint = context.getEndpoint("direct:hello");
Exchange exchange = endpoint.createExchange();
// then we set the SQL on the in body
exchange.getMessage().setBody("select * from customer order by ID");
// now we send the exchange to the endpoint, and receive the response from Camel
Exchange out = template.send(endpoint, exchange);

Если вы хотите работать со строками по одной, а не со всем ResultSet сразу, вам нужно использовать Splitter EIP, например:

from("direct:hello")
// here we split the data from the testdb into new messages one by one,
// so the mock endpoint will receive a message per row in the table
// the StreamList option allows streaming the result of the query without creating a List of rows
// and notice we also enable streaming mode on the splitter
.to("jdbc:testdb?outputType=StreamList")
  .split(body()).streaming()
  .to("mock:result");

Polling the database every minute

Если мы хотим опросить базу данных с помощью компонента JDBC, нам необходимо объединить его с планировщиком опроса, таким как Timer (opens in a new tab) или Quartz (opens in a new tab) и т. д. В следующем примере мы извлекаем данные из базы данных каждые 60 секунд:

from("timer://foo?period=60000")
  .setBody(constant("select * from customer"))
  .to("jdbc:testdb")
  .to("activemq:queue:customers");

Move Data Between Data Sources

Типичный пример использования -- запрос данных, их обработка и перенос в другой источник данных (ETL-операции). В следующем примере мы извлекаем новые записи о клиентах из исходной таблицы каждый час, фильтруем/преобразуем их и переносим в целевую таблицу:

from("timer://MoveNewCustomersEveryHour?period=3600000")
    .setBody(constant("select * from customer where create_time > (sysdate-1/24)"))
    .to("jdbc:testdb")
    .split(body())
        .process(new MyCustomerProcessor()) //filter/transform results as needed
        .setBody(simple("insert into processed_customer values('${body[ID]}','${body[NAME]}')"))
        .to("jdbc:testdb");

Spring Boot Auto-Configuration

При использовании jdbc с Spring Boot обязательно используйте следующую зависимость Maven для поддержки автоматической настройки:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-jdbc-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

Компонент поддерживает 4 опции, которые перечислены ниже.

camel.component.jdbc.autowired-enabled

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: Boolean

camel.component.jdbc.connection-strategy

  • Использовать пользовательскую стратегию для работы с соединениями. Не используйте пользовательскую стратегию при использовании компонента spring-jdbc, поскольку по умолчанию используется специальная стратегия Spring ConnectionStrategy для поддержки транзакций Spring. Этот параметр имеет тип org.apache.camel.component.jdbc.ConnectionStrategy.

  • По умолчанию:

  • Тип: ConnectionStrategy

camel.component.jdbc.enabled

  • Включить ли автоматическую настройку компонента JDBC. По умолчанию эта функция включена.

  • По умолчанию:

  • Тип: Boolean

camel.component.jdbc.lazy-start-producer

  • Тип: Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: Boolean