Java-клиент
Клиентская библиотека Java для взаимодействия с сервером БД по его протоколам. Текущая реализация поддерживает только HTTP-интерфейс. Библиотека предоставляет собственный API для отправки запросов на сервер. Также она содержит инструменты для работы с различными форматами бинарных данных (RowBinary* & Native*).
Настройка
- Maven Central (веб-страница проекта): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Ночные сборки (ссылка на репозиторий): https://central.sonatype.com/repository/maven-snapshots/
- Old Nightly builds artifactory (repository link): https://s01.oss.sonatype.org/content/repositories/snapshots/
- Maven
- Gradle (Kotlin)
- Gradle
Инициализация
Объект Client инициализируется с помощью com.clickhouse.client.api.Client.Builder#build(). Каждый клиент имеет собственный контекст, объекты между клиентами не разделяются.
Builder предоставляет методы конфигурации для удобной настройки.
Пример:
Client реализует интерфейс AutoCloseable, и его следует закрывать, когда он больше не нужен.
Аутентификация
Аутентификация настраивается для каждого клиента на этапе инициализации. Поддерживаются три метода аутентификации: по паролю, по токену доступа и по клиентскому SSL‑сертификату.
Для аутентификации по паролю необходимо задать имя пользователя и пароль, вызвав методы setUsername(String) и setPassword(String):
Для аутентификации по токену доступа необходимо установить токен доступа, вызвав метод setAccessToken(String):
Аутентификация по SSL-сертификату клиента требует указания имени пользователя, включения SSL-аутентификации, указания клиентского сертификата и клиентского ключа с помощью вызова методов setUsername(String), useSSLAuthentication(boolean), setClientCertificate(String) и setClientKey(String) соответственно:
Аутентификацию SSL может быть сложно отлаживать в продакшене, поскольку многие ошибки из SSL-библиотек не дают достаточно информации. Например, если клиентский сертификат и ключ не совпадают, сервер немедленно разрывает соединение (в случае HTTP это происходит на этапе установления соединения, когда HTTP-запросы ещё не отправлены и ответ не будет получен).
Для проверки сертификатов и ключей используйте такие инструменты, как openssl:
- проверить целостность ключа:
openssl rsa -in [key-file.key] -check -noout - проверьте, что у клиентского сертификата значение CN совпадает с именем пользователя:
- получить CN из пользовательского сертификата —
openssl x509 -noout -subject -in [user.cert] - проверить, что то же значение задано в базе данных:
select name, auth_type, auth_params from system.users where auth_type = 'ssl_certificate'(запрос выведетauth_paramsс содержимым вида{"common_names":["some_user"]})
- получить CN из пользовательского сертификата —
Конфигурация
Все настройки задаются методами экземпляра (так называемыми методами конфигурации), которые однозначно определяют область действия и контекст каждого значения. Ключевые параметры конфигурации задаются на одном уровне (клиент или операция) и не переопределяют друг друга.
Конфигурация определяется при создании клиента. См. com.clickhouse.client.api.Client.Builder.
Настройка клиента
- Подключение и точки подключения
- Аутентификация
- Тайм-ауты и повторные попытки
- Параметры сокетов
- Сжатие
- SSL и безопасность
- Прокси
- HTTP и заголовки
- Настройки сервера
- Часовой пояс
- Дополнительно
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addEndpoint(String endpoint) | endpoint - адрес сервера в формате URL | Добавляет endpoint сервера в список доступных серверов. В настоящее время поддерживается только один endpoint. | none | none |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | protocol - протокол подключенияhost - IP-адрес или имя хостаsecure - использовать HTTPS | Добавляет endpoint сервера в список доступных серверов. В настоящее время поддерживается только один endpoint. | none | none |
enableConnectionPool(boolean enable) | enable - флаг включения/отключения | Устанавливает, включен ли пул соединений | true | connection_pool_enabled |
setMaxConnections(int maxConnections) | maxConnections - число соединений | Устанавливает, сколько соединений клиент может открыть к каждому endpoint-у сервера. | 10 | max_open_connections |
setConnectionTTL(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает TTL соединения, по истечении которого соединение будет считаться неактивным | -1 | connection_ttl |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут Keep-Alive для HTTP-соединения. Установите 0, чтобы отключить Keep-Alive. | - | http_keep_alive_timeout |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | strategy - LIFO или FIFO | Выбирает стратегию повторного использования соединений, которую должен применять пул соединений | FIFO | connection_reuse_strategy |
setDefaultDatabase(String database) | database - имя базы данных | Устанавливает базу данных по умолчанию. | default | database |
| Метод | Аргументы | Описание | По умолчанию | Ключ |
|---|---|---|---|---|
setUsername(String username) | username - имя пользователя для аутентификации | Задает имя пользователя для метода аутентификации, который будет выбран дальнейшей конфигурацией | default | user |
setPassword(String password) | password - секретное значение | Задает секрет для аутентификации по паролю и фактически выбирает этот метод аутентификации | - | password |
setAccessToken(String accessToken) | accessToken - строка access-токена | Задает access-токен для аутентификации и тем самым выбирает соответствующий метод аутентификации | - | access_token |
useSSLAuthentication(boolean useSSLAuthentication) | useSSLAuthentication - флаг для включения SSL-аутентификации | Устанавливает клиентский SSL-сертификат как метод аутентификации. | - | ssl_authentication |
useHTTPBasicAuth(boolean useBasicAuth) | useBasicAuth - флаг включения/отключения | Определяет, следует ли использовать базовую HTTP-аутентификацию для аутентификации по паре пользователь-пароль. Решает проблемы с паролями, содержащими спецсимволы. | true | http_use_basic_auth |
useBearerTokenAuth(String bearerToken) | bearerToken - закодированный bearer-токен | Определяет, следует ли использовать Bearer-аутентификацию и какой токен использовать. Токен будет отправлен как есть. | - | bearer_token |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setConnectTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут установления соединения для любого исходящего подключения. | - | connection_timeout |
setConnectionRequestTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут запроса соединения. Применяется только при получении соединения из пула. | 10000 | connection_request_timeout |
setSocketTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут сокета, который влияет на операции чтения и записи. | 0 | socket_timeout |
setExecutionTimeout(long timeout, ChronoUnit timeUnit) | timeout - значение тайм-аутаtimeUnit - единица времени | Устанавливает максимальное время выполнения запросов | 0 | max_execution_time |
retryOnFailures(ClientFaultCause ...causes) | causes - константа перечисления ClientFaultCause | Задает типы ошибок, для которых будут выполняться повторные попытки. | NoHttpResponse ConnectTimeout ConnectionRequestTimeout | client_retry_on_failures |
setMaxRetries(int maxRetries) | maxRetries - количество повторных попыток | Устанавливает максимальное число повторных попыток для ошибок, определенных retryOnFailures. | 3 | retry |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSocketRcvbuf(long size) | size - размер в байтах | Устанавливает размер буфера приёма TCP-сокета. Этот буфер располагается вне памяти JVM. | 8196 | socket_rcvbuf |
setSocketSndbuf(long size) | size - размер в байтах | Устанавливает размер буфера отправки TCP-сокета. Этот буфер располагается вне памяти JVM. | 8196 | socket_sndbuf |
setSocketKeepAlive(boolean value) | value - флаг для включения/выключения | Устанавливает опцию SO_KEEPALIVE для каждого TCP-сокета. TCP Keep-Alive включает механизм проверки активности соединения. | - | socket_keepalive |
setSocketTcpNodelay(boolean value) | value - флаг для включения/выключения | Устанавливает опцию SO_NODELAY для каждого TCP-сокета. Эта опция TCP заставляет сокет отправлять данные как можно скорее. | - | socket_tcp_nodelay |
setSocketLinger(int secondsToWait) | secondsToWait - количество секунд | Устанавливает время задержки (linger) для каждого TCP-сокета, созданного клиентом. | - | socket_linger |
| Метод | Аргументы | Описание | Значение по умолчанию | Ключ |
|---|---|---|---|---|
compressServerResponse(boolean enabled) | enabled — флаг включения/выключения | Определяет, должен ли сервер сжимать свои ответы. | true | compress |
compressClientRequest(boolean enabled) | enabled — флаг включения/выключения | Определяет, должен ли клиент сжимать свои запросы. | false | decompress |
useHttpCompression(boolean enabled) | enabled — флаг включения/выключения | Определяет, следует ли использовать HTTP‑сжатие для взаимодействия клиент/сервер, если соответствующие параметры включены. | - | - |
appCompressedData(boolean enabled) | enabled — флаг включения/выключения | Сообщает клиенту, что сжатие будет обрабатываться приложением. | false | app_compressed_data |
setLZ4UncompressedBufferSize(int size) | size — размер в байтах | Устанавливает размер буфера, который будет получать несжатую часть потока данных. | 65536 | compression.lz4.uncompressed_buffer_size |
disableNativeCompression | disable — флаг отключения | Отключает нативное сжатие. Если установлено в true, нативное сжатие будет отключено. | false | disable_native_compression |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSSLTrustStore(String path) | path - путь к файлу в локальной системе | Указывает, должен ли клиент использовать SSL truststore для проверки подлинности хоста сервера. | - | trust_store |
setSSLTrustStorePassword(String password) | password - секретное значение | Указывает пароль, который будет использоваться для разблокировки SSL truststore, указанного с помощью setSSLTrustStore. | - | key_store_password |
setSSLTrustStoreType(String type) | type - имя типа truststore | Указывает тип truststore, указанного с помощью setSSLTrustStore. | - | key_store_type |
setRootCertificate(String path) | path - путь к файлу в локальной системе | Указывает, должен ли клиент использовать указанный корневой (CA) сертификат для проверки подлинности хоста сервера. | - | sslrootcert |
setClientCertificate(String path) | path - путь к файлу в локальной системе | Указывает путь к клиентскому сертификату, который будет использоваться при установке SSL-соединения и для SSL-аутентификации. | - | sslcert |
setClientKey(String path) | path - путь к файлу в локальной системе | Указывает закрытый ключ клиента, который будет использоваться для шифрования SSL-взаимодействия с сервером. | - | ssl_key |
sslSocketSNI(String sni) | sni - строка с именем сервера | Указывает имя сервера, которое будет использоваться для SNI (Server Name Indication) в SSL/TLS-соединении. | - | ssl_socket_sni |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addProxy(ProxyType type, String host, int port) | type - тип проксиhost - имя хоста или IP-адрес прокси-сервераport - порт прокси-сервера | Устанавливает прокси-сервер, который будет использоваться для взаимодействия с сервером. | - | proxy_type, proxy_host, proxy_port |
setProxyCredentials(String user, String pass) | user - имя пользователя проксиpass - пароль | Задает учетные данные для аутентификации на прокси-сервере. | - | proxy_user, proxy_password |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setHttpCookiesEnabled(boolean enabled) | enabled - флаг включения/отключения | Определяет, должны ли HTTP‑cookie сохраняться и отправляться обратно на сервер. | - | - |
httpHeader(String key, String value) | key - ключ HTTP‑заголовкаvalue - строковое значение | Устанавливает значение для одного HTTP‑заголовка. Предыдущее значение перезаписывается. | none | none |
httpHeader(String key, Collection values) | key - ключ HTTP‑заголовкаvalues - список строковых значений | Устанавливает несколько значений одного HTTP‑заголовка. Предыдущее значение перезаписывается. | none | none |
httpHeaders(Map headers) | headers - map с HTTP‑заголовками | Устанавливает несколько HTTP‑заголовков за один раз. | none | none |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
serverSetting(String name, String value) | name - имя настройкиvalue - значение настройки | Указывает, какие настройки передавать серверу вместе с каждым запросом. Настройки отдельных операций могут их переопределять. Список настроек | none | none |
serverSetting(String name, Collection values) | name - имя настройкиvalues - значения настройки | Указывает, какие настройки с множественными значениями передавать серверу, например роли | none | none |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - флаг включения/выключения | Определяет, должен ли клиент использовать часовой пояс сервера при декодировании значений столбцов типов DateTime и Date. | true | use_server_time_zone |
useTimeZone(String timeZone) | timeZone - допустимый в Java идентификатор часового пояса | Определяет, должен ли использоваться указанный часовой пояс при декодировании значений столбцов типов DateTime и Date. Переопределяет часовой пояс сервера. | - | use_time_zone |
setServerTimeZone(String timeZone) | timeZone - допустимый в Java идентификатор часового пояса | Задает часовой пояс на стороне сервера. По умолчанию используется часовой пояс UTC. | UTC | server_time_zone |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setOption(String key, String value) | key - ключ параметра конфигурацииvalue - значение параметра | Устанавливает сырое значение параметров клиента. Полезно при чтении конфигурации из property-файлов. | - | - |
useAsyncRequests(boolean async) | async - флаг включения/выключения | Определяет, должен ли клиент выполнять запросы в отдельном потоке. По умолчанию отключено, так как приложение лучше знает, как организовать многопоточные задачи. | false | async |
setSharedOperationExecutor(ExecutorService executorService) | executorService - экземпляр ExecutorService | Задает ExecutorService для выполнения операционных задач. | none | none |
setClientNetworkBufferSize(int size) | size - размер в байтах | Устанавливает размер буфера в адресном пространстве памяти приложения, который используется для копирования данных между сокетом и приложением. | 300000 | client_network_buffer_size |
allowBinaryReaderToReuseBuffers(boolean reuse) | reuse - флаг включения/выключения | Если включено, двоичный читатель будет использовать заранее выделенные буферы для транскодирования чисел. Снижает нагрузку на GC для числовых данных. | - | - |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | strategy - реализация стратегии сопоставления | Задает пользовательскую стратегию, используемую для сопоставления полей класса DTO и столбцов БД при регистрации DTO. | none | none |
setClientName(String clientName) | clientName - строка с именем приложения | Устанавливает дополнительную информацию о вызывающем приложении. Будет передана в заголовке User-Agent. | - | client_name |
registerClientMetrics(Object registry, String name) | registry - экземпляр реестра Micrometername - имя группы метрик | Регистрирует метрики в экземпляре реестра Micrometer (https://micrometer.io/). | - | - |
setServerVersion(String version) | version - строка с версией сервера | Устанавливает версию сервера, чтобы избежать автоматического определения версии. | - | server_version |
typeHintMapping(Map typeHintMapping) | typeHintMapping - отображение (Map) подсказок типов | Устанавливает отображение подсказок типов для типов ClickHouse. Например, чтобы многомерные массивы представлялись в виде контейнеров Java. | - | type_hint_mapping |
Настройки сервера
Настройки на стороне сервера можно задать на уровне клиента один раз при его создании (см. метод serverSetting класса Builder) и на уровне конкретной операции (см. метод serverSetting в классе настроек операции).
⚠️ При задании параметров методом setOption (как в Client.Builder, так и в классе настроек операции) имя серверной настройки должно начинаться с префикса clickhouse_setting_. В этом случае может пригодиться метод com.clickhouse.client.api.ClientConfigProperties#serverSetting().
Пользовательский HTTP-заголовок
Пользовательские HTTP-заголовки можно задать для всех операций (на уровне клиента) или только для отдельной операции (на уровне операции).
Когда параметры задаются через метод setOption (в Client.Builder или в классе настроек операции), имя пользовательского заголовка должно начинаться с префикса http_header_. В этом случае может быть полезен метод com.clickhouse.client.api.ClientConfigProperties#httpHeader().
Общие определения
ClickHouseFormat
Перечисление поддерживаемых форматов. В него входят все форматы, поддерживаемые ClickHouse.
raw- транскодирование необработанных данных выполняется пользователемfull— клиент сам выполняет транскодирование данных и принимает сырой поток данных-- операция не поддерживается ClickHouse для данного формата
Эта версия клиента поддерживает:
API вставки
insert(String tableName, InputStream data, ClickHouseFormat format)
Принимает данные в виде потока байтов InputStream в указанном формате. Ожидается, что data кодированы в format.
Сигнатуры
Параметры
tableName — имя целевой таблицы.
data — входной поток закодированных данных.
format — формат, в котором закодированы данные.
settings — настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
insert(String tableName, List<?> data, InsertSettings settings)
Отправляет запрос на запись в базу данных. Список объектов преобразуется в эффективный формат и затем отправляется на сервер. Класс элементов списка должен быть заранее зарегистрирован с помощью метода register(Class, TableSchema).
Подписи
Параметры
tableName — имя целевой таблицы.
data — коллекция объектов DTO (Data Transfer Object).
settings — настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
InsertSettings
Параметры конфигурации для операций вставки.
Методы конфигурации
| Метод | Описание |
|---|---|
setQueryId(String queryId) | Устанавливает идентификатор запроса, который будет присвоен операции. Значение по умолчанию: null. |
setDeduplicationToken(String token) | Устанавливает токен дедупликации. Этот токен будет отправлен на сервер и может использоваться для идентификации запроса. Значение по умолчанию: null. |
setInputStreamCopyBufferSize(int size) | Размер буфера копирования. Буфер используется при операциях записи для копирования данных из входного потока, предоставленного пользователем, в выходной поток. По умолчанию: 8196. |
serverSetting(String name, String value) | Задаёт отдельную настройку сервера для операции. |
serverSetting(String name, Collection values) | Устанавливает отдельную серверную настройку с несколькими значениями для операции. Элементы коллекции должны быть значениями типа String. |
setDBRoles(Collection dbRoles) | Указывает роли БД, которые нужно назначить перед выполнением операции. Элементы коллекции должны быть значениями типа String. |
setOption(String option, Object value) | Задаёт параметр конфигурации в «сыром» виде. Это не серверная настройка. |
InsertResponse
Объект ответа, содержащий результат операции вставки. Он доступен только в том случае, если клиент получил ответ от сервера.
Этот объект необходимо закрыть как можно скорее, чтобы освободить соединение, так как его нельзя переиспользовать, пока все данные предыдущего ответа не будут полностью прочитаны.
| Метод | Описание |
|---|---|
OperationMetrics getMetrics() | Возвращает объект, содержащий метрики операции. |
String getQueryId() | Возвращает идентификатор запроса, назначенный операции приложением (через настройки операции) либо сервером. |
API запросов
query(String sqlQuery)
Отправляет sqlQuery как есть. Формат ответа задаётся настройками запроса. QueryResponse будет содержать ссылку на поток ответа, который должен быть прочитан ридером, поддерживающим соответствующий формат.
Подписи
Параметры
sqlQuery — один SQL-оператор. Запрос отправляется на сервер в исходном виде.
settings — настройки запроса.
Возвращаемое значение
Future типа QueryResponse — результирующий набор данных и дополнительная информация, такая как метрики на стороне сервера. Объект Response должен быть закрыт после чтения набора данных.
Примеры
query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)
Отправляет sqlQuery как есть. Дополнительно передаёт параметры запроса, чтобы сервер мог скомпилировать SQL-выражение.
Подписи
Параметры
sqlQuery - SQL-выражение с плейсхолдерами {}.
queryParams — словарь переменных для подстановки значений в SQL-выражение на сервере.
settings — настройки запроса.
Возвращаемое значение
Будущее типа QueryResponse — результирующий набор данных и дополнительная информация, такая как метрики на стороне сервера. Объект Response должен быть закрыт после потребления набора данных.
Примеры
queryAll(String sqlQuery)
Запрашивает данные в формате RowBinaryWithNamesAndTypes. Возвращает результат в виде коллекции. Производительность чтения такая же, как при использовании reader, но требуется больше памяти для хранения всего набора данных.
Подписи
Параметры
sqlQuery — SQL-выражение для запроса данных с сервера.
Возвращаемое значение
Полный набор данных, представленный списком объектов GenericRecord, обеспечивающих построчный доступ к данным результата.
Примеры
QuerySettings
Параметры конфигурации операций выполнения запросов.
Методы конфигурации
| Метод | Описание |
|---|---|
setQueryId(String queryId) | Задаёт идентификатор запроса, который будет присвоен операции. |
setFormat(ClickHouseFormat format) | Задаёт формат ответа. Полный список форматов см. в RowBinaryWithNamesAndTypes. |
setMaxExecutionTime(Integer maxExecutionTime) | Устанавливает время выполнения операции на сервере. Не влияет на таймаут чтения. |
waitEndOfQuery(Boolean waitEndOfQuery) | Указывает серверу дождаться завершения запроса перед отправкой ответа. |
setUseServerTimeZone(Boolean useServerTimeZone) | Часовой пояс сервера (см. конфигурацию клиента) будет использоваться при разборе значений типов дата/время в результате операции. По умолчанию false. |
setUseTimeZone(String timeZone) | Запрашивает использование сервером часового пояса timeZone для преобразования времени. См. session_timezone. |
serverSetting(String name, String value) | Задаёт отдельную настройку сервера для операции. |
serverSetting(String name, Collection values) | Устанавливает отдельную серверную настройку с несколькими значениями для операции. Элементы коллекции должны быть значениями типа String. |
setDBRoles(Collection dbRoles) | Указывает роли БД, которые нужно назначить перед выполнением операции. Элементы коллекции должны быть значениями типа String. |
setOption(String option, Object value) | Устанавливает параметр конфигурации в необработанном виде. Это не параметр сервера. |
QueryResponse
Объект ответа, содержащий результат выполнения запроса. Доступен только при получении ответа от сервера.
Этот объект необходимо закрыть как можно скорее, чтобы освободить соединение, так как соединение нельзя повторно использовать, пока все данные предыдущего ответа не будут полностью прочитаны.
| Метод | Описание |
|---|---|
ClickHouseFormat getFormat() | Возвращает формат, в котором закодированы данные в ответе. |
InputStream getInputStream() | Возвращает несжатый поток байтов данных в указанном формате. |
OperationMetrics getMetrics() | Возвращает объект с метриками операции. |
String getQueryId() | Возвращает идентификатор запроса, назначенный операции приложением (через настройки операции) или сервером. |
TimeZone getTimeZone() | Возвращает часовой пояс, который должен использоваться при обработке типов Date/DateTime в ответе. |
Примеры
- Примеры кода доступны в репозитории
- См. реализацию сервиса Spring: implementation
Общий API
getTableSchema(String table)
Извлекает схему таблицы table.
Подписи
Параметры
table — имя таблицы, для которой нужно получить данные схемы.
database — база данных, в которой определена целевая таблица.
Возвращаемое значение
Возвращает объект TableSchema со списком столбцов таблицы.
getTableSchemaFromQuery(String sql)
Получает схему из SQL-выражения.
Сигнатуры
Параметры
sql - SQL-оператор "SELECT", схема результата которого должна быть возвращена.
Возвращаемое значение
Возвращает объект TableSchema со столбцами, соответствующими выражению sql.
TableSchema
register(Class<?> clazz, TableSchema schema)
Компилирует слой сериализации и десериализации для Java-класса, используемого для записи и чтения данных с помощью schema. Метод создаёт сериализатор и десериализатор для пары getter/setter и соответствующего столбца.
Соответствие столбца находится путём извлечения его имени из имени метода. Например, getFirstName будет соответствовать столбцу first_name или firstname.
Сигнатуры
Параметры
clazz — класс POJO, используемый для чтения и записи данных.
schema - Схема данных для сопоставления со свойствами POJO.
Примеры
Примеры использования
Полный код примеров хранится в репозитории в папке example folder:
- client-v2 - основной набор примеров.
- demo-service - пример использования клиента в приложении Spring Boot.
- demo-kotlin-service - пример использования клиента в приложении Ktor на Kotlin.
Чтение данных
Существует два распространённых способа чтения данных:
- Метод
query()возвращает низкоуровневый объектQueryResponse, содержащийInputStreamс данными. Обычно он используется вместе сClickHouseBinaryFormatReaderдля потокового чтения, но может быть использован и с любой другой пользовательской реализацией ридера.QueryResponseтакже предоставляет доступ к метаданным результирующего набора данных и метрикам. - метод
queryAll()и использованиеGenericRecordдля удобного доступа к строкам. В этом случае весь результирующий набор загружается в память целиком. - Метод
queryRecords(), который возвращаетcom.clickhouse.client.api.query.Records— итератор по объектамGenericRecord. Этот метод использует потоковый подход (данные не загружаются в память) иGenericRecordдля доступа к данным.
Примечание: потоковый подход требует быстрого чтения, в противном случае, поскольку данные считываются непосредственно из сетевого потока, может возникнуть тайм-аут записи на сервере.
Чтение массивов
Методы ClickHouseBinaryFormatReader
getList(...)— читает любойArray(...)какList<T>. Хороший вариант по умолчанию для гибкого чтения с учетом типов. Поддерживает вложенные массивы.getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)— наиболее подходят для одномерных массивов значений примитивных типов или совместимых с ними.getStringArray(...)- дляArray(String)(и значений enum, представленных именами).getObjectArray(...)- универсальный метод для любого типа элементовArray(...), включая вложенные массивы. Используйте его для чтения массивов с Nullable-значениями и вложенных массивов.
Перегрузки на основе индекса и имени доступны для всех методов. Индексация начинается с 1. Методы, основанные на индексе, обеспечивают прямой доступ к столбцу. Методы, основанные на имени, при каждом вызове требуют поиска по индексу.
Методы GenericRecord
getList(...)- читает любойArray(...)какList<T>. Оптимальный вариант по умолчанию для гибкого чтения с типизацией. Поддерживает вложенные массивы.getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)— наилучшим образом подходят для одномерных массивов значений, совместимых с примитивными типами.getStringArray(...)— дляArray(String)(и значений перечислений, представленных именами).getObjectArray(...)— универсальный метод для любых типов элементовArray(...), включая вложенные массивы. Используйте его для чтения массивов с Nullable-значениями и вложенными массивами.
Перегрузки по индексу и по имени доступны для всех методов. Нумерация индексов начинается с 1. Варианты, основанные на индексе, обеспечивают прямой доступ к столбцу. Методы, основанные на имени, каждый раз требуют поиска индекса.
V2 Вставьте данные в формате TSV.
- достаточно одного вызова метода — нет необходимости создавать дополнительный объект запроса.
- Поток тела запроса автоматически закрывается после копирования всех данных.
- Теперь доступен новый низкоуровневый API
com.clickhouse.client.api.Client#insert(java.lang.String, java.util.List<java.lang.String>, com.clickhouse.client.api.DataStreamWriter, com.clickhouse.data.ClickHouseFormat, com.clickhouse.client.api.insert.InsertSettings).com.clickhouse.client.api.DataStreamWriterпредназначен для реализации пользовательской логики записи данных, например, для чтения данных из очереди.
Чтение данных
- По умолчанию данные считываются в формате
RowBinaryWithNamesAndTypes. В настоящее время, когда требуется привязка данных, поддерживается только этот формат. - Данные можно считывать как коллекцию записей с помощью метода
List<GenericRecord> com.clickhouse.client.api.Client#queryAll(java.lang.String). Метод считывает данные в память и освобождает соединение, поэтому дополнительная обработка не требуется.GenericRecordпредоставляет доступ к данным и выполняет некоторые преобразования.