Java-клиент
Клиентская библиотека Java для взаимодействия с сервером БД по его протоколам. Текущая реализация поддерживает только HTTP-интерфейс. Библиотека предоставляет собственный API для отправки запросов на сервер, а также инструменты для работы с различными форматами бинарных данных (RowBinary* & Native*).
Настройка
- Maven Central (страница проекта): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Ночные сборки (ссылка на репозиторий): https://central.sonatype.com/repository/maven-snapshots/
- Старый репозиторий Nightly-сборок в 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.
Настройка клиента
- Подключение и конечные точки
- Аутентификация
- Тайм-ауты и повторные попытки
- Параметры сокетов
- Сжатие
- 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 - имя хоста прокси или IPport - порт прокси | Устанавливает прокси-сервер, используемый для взаимодействия с сервером. | - | 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 (объектов передачи данных).
settings — настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
InsertSettings
Параметры конфигурации для операций INSERT.
Методы настройки
| Метод | Описание |
|---|---|
setQueryId(String queryId) | Устанавливает ID запроса, который будет присвоен операции. По умолчанию: 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
Объект ответа, содержащий результат операции INSERT. Доступен только в том случае, если клиент получил ответ от сервера.
Этот объект необходимо закрыть как можно скорее для освобождения соединения, так как соединение не может быть использовано повторно до полного чтения всех данных предыдущего ответа.
| Метод | Описание |
|---|---|
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 — настройки запроса.
Возвращаемое значение
Future типа 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-выражению sql.
TableSchema
register(Class<?> clazz, TableSchema schema)
Компилирует слой сериализации и десериализации для Java-класса, используемого для записи и чтения данных с помощью schema. Метод создаёт сериализатор и десериализатор для пары getter/setter и соответствующего столбца.
Соответствие столбца находится путём извлечения его имени из имени метода. Например, getFirstName будет соответствовать столбцу first_name или firstname.
Подписи
Параметры
clazz - Класс, представляющий POJO для чтения и записи данных.
schema - Схема данных, используемая для сопоставления со свойствами POJO.
Примеры
Примеры использования
Полные примеры кода хранятся в репозитории в папке example:
- client-v2 - основной набор примеров.
- demo-service - пример того, как использовать клиента в приложении Spring Boot.
- demo-kotlin-service - пример того, как использовать клиент в приложении на Ktor (Kotlin).
Руководство по миграции
Старый клиент (V1) использовал com.clickhouse.client.ClickHouseClient#builder в качестве отправной точки. Новый клиент (V2) использует аналогичный паттерн с com.clickhouse.client.api.Client.Builder. Основные
отличия:
- загрузчик сервисов (service loader) не используется для выбора реализации. Класс
com.clickhouse.client.api.Clientявляется фасадом для всех вариантов реализаций в будущем. - меньше источников конфигурации: одна передаётся билдеру и одна задаётся настройками операций (
QuerySettings,InsertSettings). В предыдущей версии конфигурация задавалась на уровне каждого узла и в некоторых случаях загружала переменные окружения.
Соответствие параметров конфигурации
В V1 имеется 3 класса перечислений, связанных с конфигурацией:
com.clickhouse.client.config.ClickHouseDefaults— параметры конфигурации, которые обычно задаются в большинстве случаев. Например,USERиPASSWORD.com.clickhouse.client.config.ClickHouseClientOption— параметры конфигурации, относящиеся к клиенту. Например,HEALTH_CHECK_INTERVAL.com.clickhouse.client.http.config.ClickHouseHttpOption— конфигурационные параметры, специфичные для HTTP-интерфейса. Например,RECEIVE_QUERY_PROGRESS.
Они были разработаны для группировки параметров и обеспечения четкого разделения. Однако в некоторых случаях это приводило к путанице (есть ли разница между com.clickhouse.client.config.ClickHouseDefaults#ASYNC и
com.clickhouse.client.config.ClickHouseClientOption#ASYNC). Новый клиент V2 использует com.clickhouse.client.api.Client.Builder в качестве единого словаря всех возможных параметров конфигурации клиента. Существует
com.clickhouse.client.api.ClientConfigProperties, где перечислены все имена параметров конфигурации.
В таблице ниже показано, какие старые параметры поддерживаются в новом клиенте и каково их новое значение.
Условные обозначения: ✔ = поддерживается, ✗ = не поддерживается
- Подключение и авторизация
- SSL и безопасность
- Параметры сокета
- Сжатие
- Прокси-сервер
- Тайм-ауты и повторные попытки
- Часовой пояс
- Буферы и производительность
- Многопоточность и асинхронность
- HTTP и заголовки
- Формат и запрос
- Обнаружение узлов и балансировка нагрузки
- Прочее
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#HOST | Client.Builder#addEndpoint | |
ClickHouseDefaults#PROTOCOL | ✗ | В V2 поддерживается только HTTP-протокол |
ClickHouseDefaults#DATABASEClickHouseClientOption#DATABASE | Client.Builder#setDefaultDatabase | |
ClickHouseDefaults#USER | Client.Builder#setUsername | |
ClickHouseDefaults#PASSWORD | Client.Builder#setPassword | |
ClickHouseClientOption#CONNECTION_TIMEOUT | Client.Builder#setConnectTimeout | |
ClickHouseClientOption#CONNECTION_TTL | Client.Builder#setConnectionTTL | |
ClickHouseHttpOption#MAX_OPEN_CONNECTIONS | Client.Builder#setMaxConnections | |
ClickHouseHttpOption#KEEP_ALIVEClickHouseHttpOption#KEEP_ALIVE_TIMEOUT | Client.Builder#setKeepAliveTimeout | |
ClickHouseHttpOption#CONNECTION_REUSE_STRATEGY | Client.Builder#setConnectionReuseStrategy | |
ClickHouseHttpOption#USE_BASIC_AUTHENTICATION | Client.Builder#useHTTPBasicAuth |
| Конфигурация V1 | Метод Builder V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#SSL_CERTIFICATE_TYPE | ✗ | |
ClickHouseDefaults#SSL_KEY_ALGORITHM | ✗ | |
ClickHouseDefaults#SSL_PROTOCOL | ✗ | |
ClickHouseClientOption#SSL | ✗ | См. Client.Builder#addEndpoint |
ClickHouseClientOption#SSL_MODE | ✗ | |
ClickHouseClientOption#SSL_ROOT_CERTIFICATE | Client.Builder#setRootCertificate | Аутентификация SSL должна быть включена с помощью useSSLAuthentication |
ClickHouseClientOption#SSL_CERTIFICATE | Client.Builder#setClientCertificate | |
ClickHouseClientOption#SSL_KEY | Client.Builder#setClientKey | |
ClickHouseClientOption#KEY_STORE_TYPE | Client.Builder#setSSLTrustStoreType | |
ClickHouseClientOption#TRUST_STORE | Client.Builder#setSSLTrustStore | |
ClickHouseClientOption#KEY_STORE_PASSWORD | Client.Builder#setSSLTrustStorePassword | |
ClickHouseClientOption#SSL_SOCKET_SNI | Client.Builder#sslSocketSNI | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY | ✗ | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY_OPTIONS | ✗ | См. Client.Builder#sslSocketSNI для настройки SNI |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#SOCKET_TIMEOUT | Client.Builder#setSocketTimeout | |
ClickHouseClientOption#SOCKET_REUSEADDR | Client.Builder#setSocketReuseAddress | |
ClickHouseClientOption#SOCKET_KEEPALIVE | Client.Builder#setSocketKeepAlive | |
ClickHouseClientOption#SOCKET_LINGER | Client.Builder#setSocketLinger | |
ClickHouseClientOption#SOCKET_IP_TOS | ✗ | |
ClickHouseClientOption#SOCKET_TCP_NODELAY | Client.Builder#setSocketTcpNodelay | |
ClickHouseClientOption#SOCKET_RCVBUF | Client.Builder#setSocketRcvbuf | |
ClickHouseClientOption#SOCKET_SNDBUF | Client.Builder#setSocketSndbuf |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#COMPRESS | Client.Builder#compressServerResponse | См. также useHttpCompression |
ClickHouseClientOption#DECOMPRESS | Client.Builder#compressClientRequest | См. также useHttpCompression |
ClickHouseClientOption#COMPRESS_ALGORITHM | ✗ | LZ4 для не-HTTP-протокола. HTTP использует Accept-Encoding |
ClickHouseClientOption#DECOMPRESS_ALGORITHM | ✗ | LZ4 для не-HTTP-протокола. HTTP использует Content-Encoding |
ClickHouseClientOption#COMPRESS_LEVEL | ✗ | |
ClickHouseClientOption#DECOMPRESS_LEVEL | ✗ |
| Параметры конфигурации V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#PROXY_TYPE | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_HOST | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_PORT | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_USERNAME | Client.Builder#setProxyCredentials | |
ClickHouseClientOption#PROXY_PASSWORD | Client.Builder#setProxyCredentials |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#MAX_EXECUTION_TIME | Client.Builder#setExecutionTimeout | |
ClickHouseClientOption#RETRY | Client.Builder#setMaxRetries | См. также retryOnFailures |
ClickHouseHttpOption#AHC_RETRY_ON_FAILURE | Client.Builder#retryOnFailures | |
ClickHouseClientOption#FAILOVER | ✗ | |
ClickHouseClientOption#REPEAT_ON_SESSION_LOCK | ✗ | |
ClickHouseClientOption#SESSION_ID | ✗ | |
ClickHouseClientOption#SESSION_CHECK | ✗ | |
ClickHouseClientOption#SESSION_TIMEOUT | ✗ |
| Конфигурация в V1 | Метод Builder в V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#SERVER_TIME_ZONEClickHouseClientOption#SERVER_TIME_ZONE | Client.Builder#setServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE | Client.Builder#useServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE_FOR_DATES | ||
ClickHouseClientOption#USE_TIME_ZONE | Client.Builder#useTimeZone |
| Параметр V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#BUFFER_SIZE | Client.Builder#setClientNetworkBufferSize | |
ClickHouseClientOption#BUFFER_QUEUE_VARIATION | ✗ | |
ClickHouseClientOption#READ_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#WRITE_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_CHUNK_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_BUFFERING | ✗ | |
ClickHouseClientOption#RESPONSE_BUFFERING | ✗ | |
ClickHouseClientOption#MAX_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#MAX_QUEUED_BUFFERS | ✗ | |
ClickHouseClientOption#MAX_QUEUED_REQUESTS | ✗ | |
ClickHouseClientOption#REUSE_VALUE_WRAPPER | ✗ |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#ASYNCClickHouseClientOption#ASYNC | Client.Builder#useAsyncRequests | |
ClickHouseDefaults#MAX_SCHEDULER_THREADS | ✗ | см. setSharedOperationExecutor |
ClickHouseDefaults#MAX_THREADS | ✗ | см. setSharedOperationExecutor |
ClickHouseDefaults#THREAD_KEEPALIVE_TIMEOUT | см. setSharedOperationExecutor | |
ClickHouseClientOption#MAX_THREADS_PER_CLIENT | ✗ | |
ClickHouseClientOption#MAX_CORE_THREAD_TTL | ✗ |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseHttpOption#CUSTOM_HEADERS | Client.Builder#httpHeaders | |
ClickHouseHttpOption#CUSTOM_PARAMS | ✗ | См. Client.Builder#serverSetting |
ClickHouseClientOption#CLIENT_NAME | Client.Builder#setClientName | |
ClickHouseHttpOption#CONNECTION_PROVIDER | ✗ | |
ClickHouseHttpOption#DEFAULT_RESPONSE | ✗ | |
ClickHouseHttpOption#SEND_HTTP_CLIENT_ID | ✗ | |
ClickHouseHttpOption#AHC_VALIDATE_AFTER_INACTIVITY | ✗ | Всегда включено при использовании Apache Http Client |
| Конфигурация V1 | Метод построителя V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#FORMATClickHouseClientOption#FORMAT | ✗ | Перемещено в настройки операций (QuerySettings и InsertSettings) |
ClickHouseClientOption#QUERY_ID | ✗ | См. QuerySettings и InsertSettings |
ClickHouseClientOption#LOG_LEADING_COMMENT | ✗ | См. QuerySettings#logComment и InsertSettings#logComment |
ClickHouseClientOption#MAX_RESULT_ROWS | ✗ | Это серверная настройка |
ClickHouseClientOption#RESULT_OVERFLOW_MODE | ✗ | Это серверная настройка |
ClickHouseHttpOption#RECEIVE_QUERY_PROGRESS | ✗ | Серверная настройка |
ClickHouseHttpOption#WAIT_END_OF_QUERY | ✗ | Серверная настройка |
ClickHouseHttpOption#REMEMBER_LAST_SET_ROLES | Client#setDBRoles | Теперь относится к конфигурации времени выполнения. См. также QuerySettings#setDBRoles и InsertSettings#setDBRoles |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#AUTO_DISCOVERY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_POLICY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_TAGS | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_METHOD | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_LIMIT | ✗ | |
ClickHouseClientOption#NODE_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_GROUP_SIZE | ✗ | |
ClickHouseClientOption#CHECK_ALL_NODES | ✗ |
| Конфигурация V1 | Метод построителя V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#AUTO_SESSION | ✗ | Поддержка сессий будет пересмотрена |
ClickHouseDefaults#BUFFERING | ✗ | |
ClickHouseDefaults#MAX_REQUESTS | ✗ | |
ClickHouseDefaults#ROUNDING_MODE | ||
ClickHouseDefaults#SERVER_VERSIONClickHouseClientOption#SERVER_VERSION | Client.Builder#setServerVersion | |
ClickHouseDefaults#SRV_RESOLVE | ✗ | |
ClickHouseClientOption#CUSTOM_SETTINGS | ||
ClickHouseClientOption#PRODUCT_NAME | ✗ | Использовать имя клиента |
ClickHouseClientOption#RENAME_RESPONSE_COLUMN | ✗ | |
ClickHouseClientOption#SERVER_REVISION | ✗ | |
ClickHouseClientOption#TRANSACTION_TIMEOUT | ✗ | |
ClickHouseClientOption#WIDEN_UNSIGNED_TYPES | ✗ | |
ClickHouseClientOption#USE_BINARY_STRING | ✗ | |
ClickHouseClientOption#USE_BLOCKING_QUEUE | ✗ | |
ClickHouseClientOption#USE_COMPILATION | ✗ | |
ClickHouseClientOption#USE_OBJECTS_IN_ARRAYS | ✗ | |
ClickHouseClientOption#MAX_MAPPER_CACHE | ✗ | |
ClickHouseClientOption#MEASURE_REQUEST_TIME | ✗ |
Общие отличия
- Клиент V2 использует меньше проприетарных классов, что повышает портируемость. Например, V2 работает с любой реализацией
java.io.InputStreamдля записи данных на сервер. - Настройка
asyncв Client V2 по умолчанию отключена (off). Это означает отсутствие дополнительных потоков и больший контроль приложения над клиентом. В большинстве случаев эта настройка должна оставатьсяoff. Включениеasyncсоздаст отдельный поток для запроса. Это имеет смысл только при использовании управляемого приложением executor (см.com.clickhouse.client.api.Client.Builder#setSharedOperationExecutor)
Запись данных
- Используйте любую реализацию интерфейса
java.io.InputStream. Версия V1com.clickhouse.data.ClickHouseInputStreamподдерживается, но НЕ рекомендуется к использованию. - После обнаружения конца входного потока он обрабатывается соответствующим образом. Перед этим должен быть закрыт выходной поток запроса.
V1 Вставка данных в формате TSV.
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предоставляет доступ к данным и реализует некоторые преобразования.