JDBC ドライバー
clickhouse-jdbcは最新のJavaクライアントを使用して標準JDBCインターフェースを実装しています。
パフォーマンスまたは直接アクセスが重要な場合は、最新のJavaクライアントを直接使用することを推奨します。
環境要件
- OpenJDK バージョン 8 以上
セットアップ
- Maven
- Gradle (Kotlin)
- Gradle
設定
ドライバークラス: com.clickhouse.jdbc.ClickHouseDriver
com.clickhouse.jdbc.ClickHouseDriverは、新旧のJDBC実装に対するファサードクラスです。デフォルトでは新しいJDBC実装が使用されます。
接続プロパティでclickhouse.jdbc.v1プロパティをtrueに設定することにより、古いJDBC実装を使用できます。
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 にはエンドポイントを 1 つのみ 設定できます
- デフォルトである 'HTTP' 以外のプロトコルを使用する場合は、プロトコルを明示的に指定する必要があります
- デフォルトのポート '8123' 以外を使用する場合は、ポート番号を明示的に指定する必要があります
- ドライバはポート番号からプロトコルを推測しないため、明示的に指定する必要があります。
- プロトコルを指定した場合は、
sslパラメータの指定は不要です。
接続プロパティ
主要な設定パラメータはJavaクライアントで定義されています。これらはそのままドライバに渡してください。ドライバには、クライアント設定には含まれない独自のプロパティがあり、以下に記載されています。
ドライバープロパティ:
| プロパティ | デフォルト値 | 説明 |
|---|---|---|
disable_frameworks_detection | true | User-Agent に基づくフレームワーク検出を無効にする |
jdbc_ignore_unsupported_values | false | SQLFeatureNotSupportedException がドライバーの動作に影響しない箇所では、その例外を抑制します |
clickhouse.jdbc.v1 | false | 新しい JDBC 実装ではなく、旧 JDBC 実装を使用する |
default_query_settings | null | クエリ操作にデフォルトのクエリ設定を渡せるようにする |
jdbc_resultset_auto_close | true | Statement をクローズしたときに ResultSet も自動的にクローズします |
beta.row_binary_for_simple_insert | false | RowBinary writer ベースの PreparedStatement 実装を使用します。INSERT INTO ... VALUES クエリに対してのみ有効です。 |
jdbc_resultset_auto_close | true | Statement のクローズ時に ResultSet を自動的にクローズします |
jdbc_use_max_result_rows | false | サーバープロパティ max_result_rows の使用を有効にし、クエリで返される行数を制限します。有効化すると、ユーザー設定のオーバーフローモードを上書きします。詳細は JavaDoc を参照してください。 |
jdbc_sql_parser | JAVACC | 使用する SQL パーサーを設定します。選択可能な値: ANTLR4, ANTLR4_PARAMS_PARSER, JAVACC。 |
設定例:
以下のJDBC URLと同等になります:
注記: JDBC URLやプロパティを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タイムアウトエラーが発生することがあります:
これらのエラーはデータ挿入プロセスを中断し、システムの安定性に影響を与える可能性があります。この問題に対処するには、クライアントOS上のいくつかのタイムアウト設定を調整する必要がある場合があります。
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では、同等の設定のみでは問題が解決しない場合があります。Linuxにおけるソケットキープアライブ設定の処理方法の違いにより、追加の手順が必要です。以下の手順に従ってください:
/etc/sysctl.confまたは関連する設定ファイルで、以下の Linux カーネルパラメータを調整します。
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 仕様および Java の標準機能に含まれていないため、JDBC V2 ではサポートされていません。
- JDBC V2 では明示的な設定が必要です。フェイルオーバー用のデフォルト設定はありません。
- プロトコルは URL で明示的に指定する必要があります。ポート番号に基づく暗黙的なプロトコルの自動判別は行われません。
設定の変更
列挙型は2つのみです:
com.clickhouse.jdbc.DriverProperties- ドライバー固有の設定プロパティです。com.clickhouse.client.api.ClientConfigProperties- クライアントの構成プロパティを表します。クライアント構成の変更については、Java クライアントのドキュメントを参照してください。
接続プロパティは次のように解析されます:
- URL は最初にプロパティとして解析され、その値が他のすべてのプロパティより優先されます。
- ドライバーのプロパティはクライアント側に渡されません。
- エンドポイント(ホスト、ポート、プロトコル)は 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は、JDBC との互換性を高めるためにjava.sql.Dateにマッピングされます。ただし、ResultSet.getObject(int, Class<T>)の第 2 引数にjava.time.LocalDate.classを指定することで、java.time.LocalDateを取得することも可能です。Array型はjava.sql.Arrayオブジェクトにマッピングされます。Tupleはjava.sql.Structオブジェクトにマッピングされますが、Arrayとしても扱うことができます。