Java-клиент
Java-клиентская библиотека для взаимодействия с сервером БД по его протоколам. Текущая реализация поддерживает только HTTP-интерфейс. Библиотека предоставляет собственный API для отправки запросов к серверу, а также инструменты для работы с различными двоичными форматами данных (RowBinary* & Native*).
Настройка
- Maven Central (страница проекта): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Ночные сборки (ссылка на репозиторий): https://central.sonatype.com/repository/maven-snapshots/
- Старый репозиторий Artifactory с ночными сборками (ссылка на репозиторий): 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.
Настройка клиента
| Способ настройки | Аргументы | Описание |
|---|---|---|
addEndpoint(String endpoint) | * endpoint — адрес сервера в формате URL. | Добавляет конечную точку сервера в список доступных серверов. В настоящее время поддерживается только одна конечная точка. По умолчанию: none Перечисление: none Ключ: none |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | - protocol - протокол соединения com.clickhouse.client.api.enums.Protocol#HTTP.- host - IP-адрес или имя хоста сервера.- secure - следует ли использовать защищённую версию протокола (HTTPS) | Добавляет конечную точку сервера в список доступных серверов. В настоящее время поддерживается только одна конечная точка. По умолчанию: none Перечисление: none Ключ: none |
setOption(String key, String value) | * key - строковый ключ опции конфигурации клиента.- value - строковое значение опции | Устанавливает «сырое» значение параметров клиента. Полезно при чтении конфигурации из файлов свойств. |
setUsername(String username) | - username - имя пользователя, используемое для аутентификации | Задает имя пользователя для метода аутентификации, выбираемого дальнейшей конфигурацией По умолчанию: default Enum: ClientConfigProperties.USER Ключ: user |
setPassword(String password) | * password — секретное значение для аутентификации по паролю | Задает секрет для аутентификации по паролю и фактически выбирает этот метод аутентификации По умолчанию: - Enum: ClientConfigProperties.PASSWORD Key: password |
setAccessToken(String accessToken) | - accessToken - строковая форма токена доступа | Устанавливает токен доступа для аутентификации и настраивает соответствующий метод аутентификации По умолчанию: - Enum: ClientConfigProperties.ACCESS_TOKEN Ключ: access_token |
useSSLAuthentication(boolean useSSLAuthentication) | * useSSLAuthentication - флаг, указывающий, следует ли использовать аутентификацию SSL | Задает клиентский SSL-сертификат как метод аутентификации. По умолчанию: - Перечисление: ClientConfigProperties.SSL_AUTH Ключ: ssl_authentication |
enableConnectionPool(boolean enable) | - enable - флаг, указывающий, следует ли включить этот параметр | Определяет, включен ли пул подключений По умолчанию: true Enum: ClientConfigProperties.CONNECTION_POOL_ENABLED Key: connection_pool_enabled |
setConnectTimeout(long timeout, ChronoUnit unit) | * timeout - значение тайм-аута в определённой единице времени.- unit - единица времени для timeout | Устанавливает таймаут инициализации соединения для любого исходящего соединения. Это влияет на время ожидания установления соединения по сокету. По умолчанию: - Enum: ClientConfigProperties.CONNECTION_TIMEOUT Key: connection_timeout |
setConnectionRequestTimeout(long timeout, ChronoUnit unit) | - timeout - значение тайм-аута в некоторой единице измерения времени.- unit - единица измерения времени для параметра timeout | Устанавливает таймаут запроса соединения. Применяется только при получении соединения из пула. По умолчанию: 10000 Enum: ClientConfigProperties.CONNECTION_REQUEST_TIMEOUT Key: connection_request_timeout |
setMaxConnections(int maxConnections) | * maxConnections - максимальное количество соединений | Задает, сколько соединений может клиент открыть к каждой конечной точке сервера. По умолчанию: 10 Enum: ClientConfigProperties.HTTP_MAX_OPEN_CONNECTIONS Key: max_open_connections |
setConnectionTTL(long timeout, ChronoUnit unit) | - timeout - тайм-аут в заданных единицах времени.- unit - единица измерения времени для timeout | Устанавливает время жизни (TTL) соединения, по истечении которого соединение будет считаться неактивным По умолчанию: -1 Enum: ClientConfigProperties.CONNECTION_TTL Key: connection_ttl |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | * timeout - тайм-аут в определённой единице времени.- unit - единица времени для значения timeout | Устанавливает тайм-аут поддержания активности HTTP-соединения (keep-alive). Этот параметр можно использовать для отключения Keep-Alive, установив тайм-аут равным нулю — 0 По умолчанию: - Enum: ClientConfigProperties.HTTP_KEEP_ALIVE_TIMEOUT Ключ: http_keep_alive_timeout |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | - strategy - константа перечисления (enum) com.clickhouse.client.api.ConnectionReuseStrategy | Определяет стратегию, которую должен использовать пул соединений: LIFO — если соединение должно переиспользоваться сразу после возврата в пул, или FIFO — чтобы использовать соединения в порядке их появления (возвращённые соединения не используются немедленно). По умолчанию: FIFO Enum: ClientConfigProperties.CONNECTION_REUSE_STRATEGY Ключ: connection_reuse_strategy |
setSocketTimeout(long timeout, ChronoUnit unit)` | *timeout- таймаут в заданной единице измерения времени.- unit- единица измерения времени дляtimeout | Задает тайм-аут сокета для операций чтения и записи По умолчанию: 0Enum: ClientConfigProperties.SOCKET_OPERATION_TIMEOUTKey: socket_timeout |
setSocketRcvbuf(long size) | -size— размер в байтах | Задает размер приемного буфера TCP-сокета. Этот буфер размещается вне памяти JVM. Default: 8196Enum: ClientConfigProperties.SOCKET_RCVBUF_OPTKey: socket_rcvbuf |
setSocketSndbuf(long size) | *size- размер в байтах | Устанавливает буфер приёма TCP-сокета. Этот буфер располагается вне памяти JVM. По умолчанию: 8196Enum: ClientConfigProperties.SOCKET_SNDBUF_OPTКлюч: socket_sndbuf |
setSocketKeepAlive(boolean value) | -value- флаг, указывающий, нужно ли включить параметр. | Устанавливает опциюSO_KEEPALIVEдля каждого TCP-сокета, создаваемого клиентом. TCP Keep Alive включает механизм, который проверяет активность соединения и помогает обнаруживать соединения, разорванные внезапно. По умолчанию: - Enum: ClientConfigProperties.SOCKET_KEEPALIVE_OPTKey: socket_keepalive |
setSocketTcpNodelay(boolean value) | *value— флаг, указывающий, нужно ли включать эту опцию. | Устанавливает опциюSO_NODELAYдля каждого TCP-сокета, создаваемого клиентом. Эта TCP-опция заставляет сокет передавать данные как можно скорее. По умолчанию: - Enum: ClientConfigProperties.SOCKET_TCP_NO_DELAY_OPTKey: socket_tcp_nodelay |
setSocketLinger(int secondsToWait) | -secondsToWait- количество секунд. | Задаёт время ожидания при закрытии (linger) для каждого TCP-сокета, создаваемого клиентом. По умолчанию: - Enum: ClientConfigProperties.SOCKET_LINGER_OPTKey: socket_linger |
compressServerResponse(boolean enabled) | *enabled- флаг, определяющий, нужно ли включать эту опцию | Определяет, должен ли сервер сжимать свои ответы. По умолчанию: trueEnum: ClientConfigProperties.COMPRESS_SERVER_RESPONSEКлюч: compress |
compressClientRequest(boolean enabled) | -enabled— флаг, указывающий, включена ли опция | Определяет, должен ли клиент сжимать свои запросы. По умолчанию: falseEnum: ClientConfigProperties.COMPRESS_CLIENT_REQUESTКлюч: decompress |
useHttpCompression(boolean enabled) | *enabled- флаг, определяющий, должен ли быть включён параметр | Определяет, следует ли использовать HTTP-сжатие для обмена данными между клиентом и сервером, если включены соответствующие опции |
appCompressedData(boolean enabled) | -enabled- флаг, указывающий, должна ли опция быть включена | Сообщает клиенту, что сжатие данных будет выполняться приложением. По умолчанию: falseEnum: ClientConfigProperties.APP_COMPRESSED_DATAКлюч: app_compressed_data |
setLZ4UncompressedBufferSize(int size) | *size— размер в байтах | Устанавливает размер буфера, который будет принимать несжатую часть потока данных. Если размер буфера занижен — будет создан новый буфер, а в логах появится соответствующее предупреждение. По умолчанию: 65536Enum: ClientConfigProperties.COMPRESSION_LZ4_UNCOMPRESSED_BUF_SIZEKey: compression.lz4.uncompressed_buffer_size |
disableNativeCompression | -disable- флаг, определяющий, нужно ли отключить опцию | Отключить нативное сжатие. Если установлено в true, нативное сжатие будет отключено. По умолчанию: falseEnum: ClientConfigProperties.DISABLE_NATIVE_COMPRESSIONКлюч: disable_native_compression |
setDefaultDatabase(String database) | *database- название базы данных | Задает базу данных по умолчанию. По умолчанию: defaultEnum: ClientConfigProperties.DATABASEКлюч: database |
addProxy(ProxyType type, String host, int port) | -type- тип прокси-сервера.- host- имя хоста или IP-адрес прокси-сервера.- port- порт прокси-сервера | Задает прокси-сервер, используемый для связи с сервером. Настройка прокси обязательна, если для работы через него требуется аутентификация. По умолчанию: - Enum: ClientConfigProperties.PROXY_TYPEKey: proxy_typeПо умолчанию: - Enum: ClientConfigProperties.PROXY_HOSTKey: proxy_host По умолчанию: - Enum: ClientConfigProperties.PROXY_PORTKey: proxy_port |
setProxyCredentials(String user, String pass) | *user- имя пользователя для прокси.- pass- пароль | Задает учетные данные пользователя для аутентификации на прокси-сервере. По умолчанию: - Enum: ClientConfigProperties.PROXY_USERКлюч: proxy_userПо умолчанию: - Enum: ClientConfigProperties.PROXY_PASSWORDКлюч: proxy_password |
setExecutionTimeout(long timeout, ChronoUnit timeUnit) | -timeout- тайм-аут, заданный в некоторой единице времени.- timeUnit- единица времени для параметраtimeout | Устанавливает максимальное время выполнения запросов Значение по умолчанию: 0Enum: ClientConfigProperties.MAX_EXECUTION_TIMEКлюч: max_execution_time |
setHttpCookiesEnabled(boolean enabled) | enabled- флаг, определяющий, должна ли быть включена опция | Определяет, нужно ли запоминать HTTP‑cookie и отправлять их обратно на сервер. |
setSSLTrustStore(String path) | path— путь к файлу в локальной системе (на стороне клиента) | Определяет, должен ли клиент использовать SSL truststore для проверки хоста сервера. По умолчанию: - Enum: ClientConfigProperties.SSL_TRUST_STOREKey: trust_store |
setSSLTrustStorePassword(String password) | password— секрет | Устанавливает пароль, который будет использоваться для доступа к SSL truststore, указанному с помощьюsetSSLTrustStore(String path)По умолчанию: - Перечисление: ClientConfigProperties.SSL_KEY_STORE_PASSWORDКлюч: key_store_password |
setSSLTrustStoreType(String type) | type— имя типа хранилища доверенных сертификатов | Задаёт тип хранилища доверенных сертификатов, указанного вsetSSLTrustStore(String path). По умолчанию: - Enum: ClientConfigProperties.SSL_KEYSTORE_TYPEКлюч: key_store_type |
setRootCertificate(String path) | path— путь к файлу в локальной системе (на стороне клиента) | Определяет, должен ли клиент использовать указанный корневой (CA) сертификат для проверки подлинности узла сервера. По умолчанию: - Enum: ClientConfigProperties.CA_CERTIFICATEKey: sslrootcert |
setClientCertificate(String path) | path— путь к файлу в локальной системе (на стороне клиента) | Устанавливает путь к клиентскому сертификату, который будет использоваться при установлении SSL-соединения и для SSL-аутентификации. По умолчанию: - Enum: ClientConfigProperties.SSL_CERTIFICATEKey: sslcert |
setClientKey(String path) | path— путь к файлу в локальной системе (на стороне клиента) | Задаёт закрытый ключ клиента, используемый для шифрования SSL-соединения с сервером. По умолчанию: - Enum: ClientConfigProperties.SSL_KEYКлюч: ssl_key |
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone- флаг, определяющий, следует ли включать эту опцию | Определяет, должен ли клиент использовать временную зону сервера при декодировании значений столбцов DateTime и Date. Если параметр включён, временная зона сервера должна быть установлена с помощьюsetServerTimeZone(String timeZone)По умолчанию: trueEnum: ClientConfigProperties.USE_SERVER_TIMEZONEКлюч: use_server_time_zone |
useTimeZone(String timeZone) | timeZone- строковое значение допустимого идентификатора часового пояса Java (см.java.time.ZoneId) | Определяет, следует ли использовать указанную временную зону при декодировании значений столбцов DateTime и Date. Переопределяет временную зону сервера. По умолчанию: - Enum: ClientConfigProperties.USE_TIMEZONEKey: use_time_zone |
setServerTimeZone(String timeZone) | timeZone— строковое значение допустимого идентификатора часового пояса в Java (см.java.time.ZoneId) | Устанавливает часовой пояс сервера. По умолчанию используется часовой пояс UTC. По умолчанию: UTCEnum: ClientConfigProperties.SERVER_TIMEZONEКлюч: server_time_zone |
useAsyncRequests(boolean async) | async- флаг, указывающий, нужно ли включить эту опцию. | Определяет, должен ли клиент выполнять запрос в отдельном потоке. По умолчанию параметр отключён, так как приложение обычно лучше понимает, как организовывать многопоточные задачи, а запуск задач в отдельном потоке не улучшает производительность. По умолчанию: falseEnum: ClientConfigProperties.ASYNC_OPERATIONSKey: async |
setSharedOperationExecutor(ExecutorService executorService) | executorService— экземпляр службы исполнителей. | Задает сервис выполнения задач операции. По умолчанию: noneEnum: noneКлюч: none |
setClientNetworkBufferSize(int size) | *size— размер в байтах | Задает размер буфера в пространстве памяти приложения, который используется для копирования данных между сокетом и приложением в обоих направлениях. Увеличение этого размера уменьшает количество системных вызовов к TCP-стеку, но увеличивает объем памяти, расходуемой на каждое соединение. Этот буфер также подлежит сборке мусора, поскольку соединения кратковременные. Обратите также внимание, что выделение большого непрерывного блока памяти может быть проблемой. По умолчанию: 300000Enum: ClientConfigProperties.CLIENT_NETWORK_BUFFER_SIZEKey: client_network_buffer_size |
retryOnFailures(ClientFaultCause ...causes) | -causes- константа перечисленияenum com.clickhouse.client.api.ClientFaultCause | Задаёт типы ошибок, при которых выполняется повторная попытка. По умолчанию: NoHttpResponse,ConnectTimeout,ConnectionRequestTimeoutEnum: ClientConfigProperties.CLIENT_RETRY_ON_FAILUREКлюч: client_retry_on_failures |
setMaxRetries(int maxRetries) | *maxRetries- число повторных попыток | Устанавливает максимальное количество повторных попыток для сбоев, определённых вretryOnFailures(ClientFaultCause ...causes)По умолчанию: 3Enum: ClientConfigProperties.RETRY_ON_FAILUREКлюч: retry |
allowBinaryReaderToReuseBuffers(boolean reuse) | -reuse— флаг, указывающий, должна ли быть включена опция | Большинство наборов данных содержат числовые данные, закодированные в виде небольших последовательностей байт. По умолчанию ридер выделяет необходимый буфер, считывает в него данные, а затем преобразует их в целевой класс Number. Это может создавать значительную нагрузку на сборщик мусора (GC), поскольку создаётся и освобождается большое количество мелких объектов. Если эта опция включена, ридер будет использовать заранее выделенные буферы для преобразования чисел. Это безопасно, поскольку у каждого ридера есть собственный набор буферов, и каждый экземпляр ридера используется только одним потоком. |
httpHeader(String key, String value) | *key- ключ заголовка HTTP.- value- строковое значение этого заголовка. | Устанавливает значение для одного HTTP-заголовка. Предыдущее значение перезаписывается. По умолчанию: noneДопустимые значения (enum): noneКлюч: none |
httpHeader(String key, Collection values) | -key- ключ заголовка HTTP.- values- список строковых значений. | Задает значение одного HTTP-заголовка. Предыдущее значение переопределяется. По умолчанию: noneПеречисление: noneКлюч: none |
httpHeaders(Map headers) | *header— карта (map) HTTP-заголовков и их значений. | Задает несколько значений HTTP-заголовков одновременно. По умолчанию: noneПеречисление: noneКлюч: none |
serverSetting(String name, String value) | -name- имя настройки на уровне запроса.- value- строковое значение настройки. | Задает, какие настройки передавать серверу вместе с каждым запросом. Настройки отдельных операций могут их переопределять. Список настроек Default: noneEnum: noneKey: none |
serverSetting(String name, Collection values) | *name- имя настройки уровня запроса.- values- строковые значения этой настройки. | Определяет, какие настройки передавать серверу вместе с каждым запросом. Отдельные настройки операций могут их переопределять. См. список настроек. Этот метод полезен, когда нужно задать настройки с несколькими значениями, например roles. По умолчанию: noneПеречисление: noneКлюч: none |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | -strategy— реализация стратегии сопоставления столбцов с полями | Задает пользовательскую стратегию, используемую для сопоставления полей класса DTO и столбцов БД при регистрации DTO. По умолчанию: noneEnum: noneКлюч: none |
useHTTPBasicAuth(boolean useBasicAuth) | *useBasicAuth- флаг, указывающий, нужно ли включить эту опцию | Задаёт, следует ли использовать базовую HTTP-аутентификацию для проверки имени пользователя и пароля. По умолчанию включено. Использование этого типа аутентификации устраняет проблемы с паролями, содержащими специальные символы, которые не могут быть корректно переданы в HTTP-заголовках. По умолчанию: trueEnum: ClientConfigProperties.HTTP_USE_BASIC_AUTHKey: http_use_basic_auth |
setClientName(String clientName) | -clientName- строка с именем приложения | Задает дополнительную информацию о клиентском приложении. Эта строка будет передана серверу как имя клиента. В случае использования протокола HTTP она будет передана как заголовокUser-Agent. Default: - Enum: ClientConfigProperties.CLIENT_NAMEKey: client_name |
useBearerTokenAuth(String bearerToken) | *bearerToken— токен типа Bearer в закодированном виде | Указывает, следует ли использовать Bearer-аутентификацию и какой токен применять. Токен будет отправлен без изменений, поэтому его следует закодировать перед передачей этому методу. По умолчанию: - Enum: ClientConfigProperties.BEARERTOKEN_AUTHКлюч: bearer_token |
registerClientMetrics(Object registry, String name) | -registry- экземпляр реестра Micrometer- name- имя группы метрик | Регистрирует сенсоры в экземпляре реестра Micrometer (https://micrometer.io/). |
setServerVersion(String version) | *version- строковое значение версии сервера | Задает версию сервера, чтобы исключить ее определение автоматически. По умолчанию: - Перечисление: ClientConfigProperties.SERVER_VERSIONКлюч: server_version |
typeHintMapping(Map typeHintMapping) | -typeHintMapping- карта подсказок типов | Задает сопоставление подсказок типов для типов ClickHouse. Например, чтобы многомерные массивы представлялись в виде контейнеров Java вместо отдельных объектов Array. По умолчанию: - Enum: ClientConfigProperties.TYPE_HINT_MAPPINGKey: type_hint_mapping |
sslSocketSNI(String sni) | *sni- значение имени сервера в виде строки | Устанавливает имя сервера, используемое для SNI (Server Name Indication) в SSL/TLS-соединении. По умолчанию: - Enum: ClientConfigProperties.SSL_SOCKET_SNIKey: ssl_socket_sni |
Настройки сервера
Параметры на стороне сервера можно задавать как один раз на уровне клиента при его создании (см. метод 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 для этого формата
Эта версия клиента поддерживает:
| Формат | Ввод | Вывод |
|---|---|---|
| TabSeparated | необработанный | сырой |
| TabSeparatedRaw | необработанный | необработанный |
| TabSeparatedWithNames | необработанные | необработанные данные |
| TabSeparatedWithNamesAndTypes | необработанный | необработанные данные |
| TabSeparatedRawWithNames | сырой | необработанный |
| TabSeparatedRawWithNamesAndTypes | необработанный | необработанные |
| Шаблон | raw | в исходном виде |
| TemplateIgnoreSpaces | raw | * |
| CSV | необработанные | сырой |
| CSVWithNames | сырые данные | сырой |
| CSVWithNamesAndTypes | необработанные данные | без обработки |
| CustomSeparated | необработанные | сырой |
| CustomSeparatedWithNames | сырые данные | необработанные |
| CustomSeparatedWithNamesAndTypes | необработанный | необработанный |
| SQLInsert | - | исходные данные |
| Values | необработанные | raw |
| Vertical | * | необработанный |
| JSON | необработанные | raw |
| JSONAsString | в исходном виде | - |
| JSONAsObject | сырой | * |
| JSONStrings | необработанные | raw |
| JSONColumns | в исходном виде | необработанные |
| JSONColumnsWithMetadata | сырые | сырой |
| JSONCompact | сырой | сырой |
| JSONCompactStrings | - | необработанный |
| JSONCompactColumns | сырые | необработанный |
| JSONEachRow | необработанный | сырой |
| PrettyJSONEachRow | * | в исходном виде |
| JSONEachRowWithProgress | - | сырые данные |
| JSONStringsEachRow | необработанный | необработанный |
| JSONStringsEachRowWithProgress | * | необработанные данные |
| JSONCompactEachRow | исходный | сырые данные |
| JSONCompactEachRowWithNames | сырой | необработанные |
| JSONCompactEachRowWithNamesAndTypes | сырые данные | необработанные |
| JSONCompactStringsEachRow | raw | сырой |
| JSONCompactStringsEachRowWithNames | сырой | необработанный |
| JSONCompactStringsEachRowWithNamesAndTypes | необработанные | необработанный |
| JSONObjectEachRow | сырой | raw |
| BSONEachRow | сырой | сырой |
| TSKV | сырые | необработанный |
| Pretty | - | сырой |
| PrettyNoEscapes | * | необработанный |
| PrettyMonoBlock | - | raw |
| PrettyNoEscapesMonoBlock | * | без обработки |
| PrettyCompact | - | сырой |
| PrettyCompactNoEscapes | * | необработанные |
| PrettyCompactMonoBlock | - | сырой |
| PrettyCompactNoEscapesMonoBlock | * | необработанные |
| PrettySpace | - | необработанный |
| PrettySpaceNoEscapes | * | исходный |
| PrettySpaceMonoBlock | - | необработанный |
| PrettySpaceNoEscapesMonoBlock | * | необработанный |
| Prometheus | - | необработанный |
| Protobuf | необработанный | необработанные |
| ProtobufSingle | необработанные | сырой |
| ProtobufList | сырые | необработанный |
| Avro | сырой | raw |
| AvroConfluent | сырые данные | * |
| Parquet | необработанные | необработанный |
| ParquetMetadata | необработанные | - |
| Arrow | необработанные | сырой |
| ArrowStream | необработанный | необработанные |
| ORC | сырой | исходный |
| One | необработанные | * |
| Npy | необработанный | сырые |
| RowBinary | полный | полный |
| RowBinaryWithNames | полный | полный |
| RowBinaryWithNamesAndTypes | полный | полный |
| RowBinaryWithDefaults | полный | - |
| Native | полный | необработанный |
| Null | * | сырой |
| XML | - | raw |
| CapnProto | необработанный | raw |
| LineAsString | сырые данные | сырой |
| Regexp | сырой | * |
| RawBLOB | необработанные данные | сырой |
| MsgPack | Необработанный | необработанный |
| MySQLDump | необработанный | - |
| DWARF | необработанные | * |
| Markdown | - | необработанные |
| Форма | необработанные | * |
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 — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
insert(String tableName, DataStreamWriter writer, ClickHouseFormat format, InsertSettings settings)
Бета
Этот метод API позволяет передать объект writer, который будет кодировать данные непосредственно в выходной поток. Сжатие данных будет выполняться на стороне клиента.
В InsertSettings есть параметр конфигурации appCompressedData, который позволяет отключить сжатие на стороне клиента и передавать в приложение ответственность за отправку уже сжатого потока.
Примеры демонстрируют основные варианты использования, для которых был разработан этот API.
com.clickhouse.client.api.DataStreamWriter — это функциональный интерфейс с методом onOutput, который вызывается клиентом, когда выходной поток готов к записи данных. У этого интерфейса есть
ещё один метод onRetry с реализацией по умолчанию. Этот метод вызывается, когда срабатывает логика повторного запроса, и в основном используется для сброса источника данных, если это применимо.
Сигнатуры
Параметры
tableName - имя целевой таблицы.
writer - экземпляр объекта записи данных.
format - формат данных, в котором writer кодирует данные.
settings - настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, серверные метрики.
Примеры
Запись коллекции JSON-объектов, закодированных в виде строковых значений, с использованием формата JSONEachRow:
Запись уже сжатых данных:
InsertSettings
Параметры конфигурации операций вставки.
Методы конфигурации
| Method | Description |
|---|---|
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
Объект ответа, который содержит результат операции вставки. Доступен только в том случае, если клиент получил ответ от сервера.
Этот объект должен быть закрыт как можно скорее, чтобы освободить соединение, поскольку соединение не может быть повторно использовано, пока все данные предыдущего ответа полностью не прочитаны.
| Method | Description |
|---|---|
OperationMetrics getMetrics() | Возвращает объект с метриками операции. |
String getQueryId() | Возвращает идентификатор запроса, назначенный операции приложением (через настройки операции) или сервером. |
API для запросов
query(String sqlQuery)
Отправляет sqlQuery как есть. Формат ответа задаётся настройками запроса. QueryResponse будет содержать ссылку на поток ответа, который должен быть прочитан объектом Reader, поддерживающим соответствующий формат.
Сигнатуры
Параметры
sqlQuery — одиночный SQL-оператор. Запрос отправляется на сервер как есть.
settings — настройки запроса.
Возвращаемое значение
Future типа QueryResponse, представляющий результирующий набор данных и дополнительную информацию, такую как серверные метрики. Объект QueryResponse необходимо закрыть после чтения набора данных.
Примеры
query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)
Отправляет sqlQuery без изменений. Также отправляет параметры запроса, чтобы сервер мог скомпилировать SQL-выражение.
Сигнатуры
Параметры
sqlQuery — SQL-выражение с плейсхолдерами {}.
queryParams — отображение (map) переменных для формирования SQL-выражения на стороне сервера.
settings — настройки запроса.
Возвращаемое значение
Объект Future типа QueryResponse — результирующий набор данных и дополнительная информация, такая как метрики на стороне сервера. Объект ответа должен быть закрыт после чтения набора данных.
Примеры
queryAll(String sqlQuery)
Выполняет запрос и возвращает данные в формате RowBinaryWithNamesAndTypes. Результат возвращается в виде коллекции. Скорость чтения такая же, как при использовании reader, но для хранения всего набора данных требуется больше памяти.
Сигнатуры
Параметры
sqlQuery - SQL-выражение для выборки данных с сервера.
Возвращаемое значение
Полный набор данных, представленный списком объектов GenericRecord, которые обеспечивают построчный доступ к данным результата.
Примеры
QuerySettings
Параметры конфигурации операций с запросами.
Методы настройки
| Method | Description |
|---|---|
setQueryId(String queryId) | Устанавливает ID запроса, который будет присвоен операции. |
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
Объект ответа, который содержит результат выполнения запроса. Доступен только в том случае, если клиент получил ответ от сервера.
Этот объект следует закрыть как можно скорее, чтобы освободить подключение, так как подключение не может быть использовано повторно, пока все данные предыдущего ответа не будут полностью прочитаны.
| Method | Description |
|---|---|
ClickHouseFormat getFormat() | Возвращает формат, в котором закодированы данные в ответе. |
InputStream getInputStream() | Возвращает несжатый байтовый поток данных в указанном формате. |
OperationMetrics getMetrics() | Возвращает объект с метриками операции. |
String getQueryId() | Возвращает ID запроса, назначенный операции приложением (через настройки операции или сервером). |
TimeZone getTimeZone() | Возвращает часовой пояс, который должен использоваться для обработки типов Date/DateTime в ответе. |
Примеры
- Пример кода доступен в репозитории
- Справочную реализацию сервиса Spring см. в этом репозитории
Общий 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.
Примеры
Примеры использования
Полные примеры кода можно найти в репозитории в папке examples:
- client-v2 — основной набор примеров.
- demo-service — пример использования клиента в приложении Spring Boot.
- demo-kotlin-service — пример использования клиента в приложении Ktor (Kotlin).