JDBC-драйвер
clickhouse-jdbc реализует стандартный интерфейс JDBC с использованием последней версии Java-клиента.
Рекомендуется использовать последнюю версию Java-клиента напрямую, если критичны производительность или прямой доступ.
Требования к среде
- OpenJDK версии >= 8
Настройка
- Maven
- Gradle (Kotlin)
- Gradle
Конфигурация
Класс драйвера: com.clickhouse.jdbc.ClickHouseDriver
com.clickhouse.jdbc.ClickHouseDriver — это класс-фасад для новой и старой реализаций JDBC. По умолчанию используется новая реализация JDBC.
Чтобы использовать старую реализацию JDBC, установите свойство clickhouse.jdbc.v1 в значение true в параметрах подключения.
com.clickhouse.jdbc.Driver — новая реализация JDBC.
com.clickhouse.jdbc.DriverV1 — старая реализация JDBC.
Синтаксис URL: jdbc:(ch|clickhouse)[:<protocol>]://endpoint[:port][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...], например:
jdbc:clickhouse:http://localhost:8123jdbc:clickhouse:https://localhost:8443?ssl=true
Обратите внимание на следующие особенности синтаксиса URL:
- В URL допускается только одна конечная точка
- протокол следует указывать, если используется не протокол по умолчанию — 'HTTP'
- порт необходимо указывать, если используется не порт по умолчанию '8123'
- драйвер не определяет протокол на основе порта, его нужно указывать явно
- Параметр
sslне требуется, если указан протокол.
Свойства соединения
Основные параметры конфигурации определены в java-клиенте. Их следует передавать драйверу без изменений. Драйвер имеет собственные свойства, которые не входят в конфигурацию клиента; они перечислены ниже.
Свойства драйвера:
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
disable_frameworks_detection | true | Отключить определение фреймворков по заголовку User-Agent |
jdbc_ignore_unsupported_values | false | Подавляет SQLFeatureNotSupportedException, если это не влияет на работу драйвера |
clickhouse.jdbc.v1 | false | Использовать старую реализацию JDBC вместо новой |
default_query_settings | null | Разрешает передавать настройки запроса по умолчанию при выполнении запросов |
jdbc_resultset_auto_close | true | Автоматически закрывает ResultSet при закрытии объекта Statement |
beta.row_binary_for_simple_insert | false | Использовать реализацию PreparedStatement, основанную на механизме записи RowBinary. Работает только для запросов INSERT INTO ... VALUES. |
jdbc_resultset_auto_close | true | Автоматически закрывает ResultSet при закрытии Statement |
jdbc_use_max_result_rows | false | Включает использование серверного свойства max_result_rows для ограничения количества строк, возвращаемых запросом. При включении переопределяет режим переполнения, установленный пользователем. Подробности см. в JavaDoc. |
jdbc_sql_parser | JAVACC | Определяет, какой SQL‑парсер будет использоваться. Доступные варианты: ANTLR4, ANTLR4_PARAMS_PARSER, JAVACC. |
Все настройки сервера должны иметь префикс clickhouse_setting_ (аналогично конфигурации клиента).
Пример конфигурации:
что будет эквивалентно следующему URL JDBC:
Примечание: URL-кодирование JDBC URL или свойств не требуется — они будут закодированы автоматически.
Поддерживаемые типы данных
Драйвер JDBC поддерживает те же форматы данных, что и базовый Java-клиент.
Обработка дат, времени и часовых поясов
java.sql.Date, java.sql.Time и java.sql.Timestamp могут усложнить вычисление часовых поясов — хотя они, разумеется, поддерживаются,
рекомендуется рассмотреть использование пакета java.time. ZonedDateTime и
OffsetDateTime являются отличной заменой для java.sql.Timestamp, java.sql.Date и java.sql.Time.
Date хранится без часового пояса, тогда как DateTime хранится с часовым поясом. Это может привести к неожиданным результатам при неосторожном использовании.
Создание соединения
Предоставление учётных данных и настроек
Простое выражение
Insert
HikariCP
Дополнительная информация
Дополнительную информацию см. в нашем репозитории GitHub и документации Java-клиента.
Устранение неполадок
Логирование
Драйвер использует slf4j для ведения журнала и будет использовать первую доступную реализацию в classpath.
Устранение таймаута JDBC при больших вставках данных
При выполнении больших вставок в ClickHouse с длительным временем выполнения могут возникать ошибки тайм-аута JDBC, такие как:
Эти ошибки могут нарушить процесс вставки данных и повлиять на стабильность системы. Чтобы устранить эту проблему, может потребоваться настроить несколько параметров таймаута в операционной системе клиента.
macOS
В macOS можно настроить следующие параметры для решения проблемы:
net.inet.tcp.keepidle: 60000net.inet.tcp.keepintvl: 45000net.inet.tcp.keepinit: 45000net.inet.tcp.keepcnt: 8net.inet.tcp.always_keepalive: 1
Linux
В Linux одних только эквивалентных настроек может быть недостаточно для решения проблемы. Необходимы дополнительные действия из-за особенностей обработки параметров keep-alive для сокетов в Linux. Выполните следующие действия:
- Измените следующие параметры ядра Linux в
/etc/sysctl.confили соответствующем конфигурационном файле:
net.inet.tcp.keepidle: 60000net.inet.tcp.keepintvl: 45000net.inet.tcp.keepinit: 45000net.inet.tcp.keepcnt: 8net.inet.tcp.always_keepalive: 1net.ipv4.tcp_keepalive_intvl: 75net.ipv4.tcp_keepalive_probes: 9net.ipv4.tcp_keepalive_time: 60 (можно рассмотреть уменьшение значения по умолчанию — 300 секунд)`
- После изменения параметров ядра примените их, выполнив следующую команду:
После настройки этих параметров необходимо убедиться, что ваш клиент включает опцию Keep Alive для сокета:
Руководство по миграции
Основные изменения
| Возможность | V1 (устаревшая) | V2 (новая) |
|---|---|---|
| Поддержка транзакций | Частично поддерживается | Не поддерживается |
| Переименование столбцов в результирующем наборе | Частично поддерживается | Не поддерживается |
| SQL с несколькими операторами | Не поддерживается | Недоступно |
| Именованные параметры запроса | Поддерживается | Не поддерживается (отсутствует в спецификации JDBC) |
Потоковая передача данных через PreparedStatement | Поддерживается | Не поддерживается |
- JDBC V2 реализован в более легковесном варианте, поэтому часть функциональности была удалена.
- Потоковая передача данных не поддерживается в JDBC V2, так как эта возможность не входит в спецификацию JDBC и Java.
- JDBC V2 требует явной конфигурации. Механизм failover по умолчанию не используется.
- Протокол должен быть указан в URL. Запрещено неявное определение протокола на основе номера порта.
Изменения конфигурации
Доступны только два перечисления:
com.clickhouse.jdbc.DriverProperties— собственные параметры конфигурации драйвера.com.clickhouse.client.api.ClientConfigProperties— свойства конфигурации клиента. Изменения конфигурации клиента описаны в документации по Java‑клиенту.
Свойства подключения разбираются следующим образом:
- Сначала свойства извлекаются из URL. Они имеют приоритет над всеми остальными свойствами.
- Параметры драйвера не передаются клиенту.
- Endpoints (host, port, protocol) определяются при разборе URL.
Пример:
Изменения типов данных
| Тип ClickHouse | Беззнаковый | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| Int8 | Нет | TINYINT | java.lang.Byte | TINYINT | java.lang.Byte |
| Int16 | Нет | SMALLINT | java.lang.Short | SMALLINT | java.lang.Short |
| Int32 | Нет | INTEGER | java.lang.Integer | INTEGER | java.lang.Integer |
| Int64 | Нет | BIGINT | java.lang.Long | BIGINT | java.lang.Long |
| UInt8 | Да | OTHER | java.lang.Short | OTHER | com.clickhouse.data.value.UnsignedByte |
| UInt16 | Да | OTHER | java.lang.Integer | OTHER | com.clickhouse.data.value.UnsignedShort |
| UInt32 | Да | OTHER | java.lang.Long | OTHER | com.clickhouse.data.value.UnsignedInteger |
| UInt64 | Да | OTHER | java.math.BigInteger | OTHER | com.clickhouse.data.value.UnsignedLong |
| Int128 | Нет | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| UInt128 | Нет | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| Int256 | Нет | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| UInt256 | Нет | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| Float32 | Нет | REAL | java.lang.Float | REAL | java.lang.Float |
| Float64 | Нет | DOUBLE | java.lang.Double | DOUBLE | java.lang.Double |
| Decimal32 | Нет | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal64 | Нет | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal128 | Нет | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal256 | Нет | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Bool | Нет | BOOLEAN | java.lang.Boolean | BOOLEAN | java.lang.Boolean |
| String | Нет | VARCHAR | java.lang.String | VARCHAR | java.lang.String |
| FixedString | Нет | CHAR | java.lang.String | CHAR | java.lang.String |
| Date | Да | DATE | java.sql.Date | DATE | java.time.LocalDate |
| Date32 | Да | DATE | java.sql.Date | DATE | java.time.LocalDate |
| DateTime | Да | TIMESTAMP | java.sql.Timestamp | TIMESTAMP | java.time.OffsetDateTime |
| DateTime64 | Да | TIMESTAMP | java.sql.Timestamp | TIMESTAMP | java.time.OffsetDateTime |
| UUID | Нет | OTHER | java.util.UUID | OTHER | java.util.UUID |
| IPv4 | Нет | OTHER | java.net.Inet4Address | OTHER | java.net.Inet4Address |
| IPv6 | Нет | OTHER | java.net.Inet6Address | OTHER | java.net.Inet6Address |
- Беззнаковые типы сопоставляются с типами Java для повышения переносимости.
DateиDate32сопоставляются сjava.sql.Dateдля лучшей совместимости с JDBC. Однакоjava.time.LocalDateможно получить с помощьюResultSet.getObject(int, Class<T>), передавjava.time.LocalDate.classв качестве второго аргумента.Arrayсопоставляется с объектомjava.sql.Array.Tupleотображается в объектjava.sql.Struct, но также может использоваться какArray.