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