JDBC ドライバー
clickhouse-jdbc は最新の Java クライアントを使用して標準 JDBC インターフェースを実装しています。パフォーマンスや直接アクセスが重要な場合は、最新の Java クライアントを直接使用することをお勧めします。
0.7.x からの変更
0.8 では、ドライバーが JDBC 仕様により厳密に従うようにしたため、いくつかの機能が削除され、影響を受ける可能性があります:
| 古い機能 | メモ |
|---|---|
| トランザクションサポート | ドライバーの初期バージョンではトランザクションサポートをシミュレーションしていただけで、予期しない結果を引き起こす可能性があります。 |
| レスポンスカラムのリネーミング | ResultSet は可変でしたが、効率のために現在は読み取り専用です。 |
| マルチステートメント SQL | マルチステートメントのサポートはシミュレーションされていましたが、現在は厳密に 1:1 に従います。 |
| 名付きパラメーター | JDBC 仕様の一部ではありません。 |
ストリームベースの PreparedStatement | ドライバーの初期バージョンでは PreparedStatement の JDBC を介さない使用が許可されていました。こうしたオプションが必要な場合は、Java Client およびその 例 を確認することをお勧めします。 |
Date はタイムゾーンなしで保存され、DateTime はタイムゾーン付きで保存されます。注意しないと予期しない結果を招く可能性があります。
環境要件
- OpenJDK バージョン >= 8
セットアップ
- Maven
- Gradle (Kotlin)
- Gradle
設定
ドライバークラス: com.clickhouse.jdbc.ClickHouseDriver
URL 構文: jdbc:(ch|clickhouse)[:<protocol>]://endpoint1[,endpoint2,...][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...]。例えば:
jdbc:clickhouse:http://localhost:8123jdbc:clickhouse:https://localhost:8443?ssl=true
接続プロパティ:
標準 JDBC プロパティに加えて、ドライバーは基盤となる java client が提供する ClickHouse 特有のプロパティをサポートします。サポートされない機能に関しては、可能な限りメソッドが SQLFeatureNotSupportedException を返します。他のカスタムプロパティには次のようなものがあります:
| プロパティ | デフォルト | 説明 |
|---|---|---|
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 ライターに基づいた PreparedStatement 実装を使用します。INSERT INTO ... VALUES クエリ専用です。 |
サポートされるデータ型
JDBC ドライバーは基盤となる java client と同じデータ形式をサポートします。
日付、時刻、およびタイムゾーンの取り扱い
java.sql.Date、java.sql.Time、および java.sql.Timestamp はタイムゾーンの計算を複雑にする可能性があります - もちろんサポートされていますが、java.time パッケージの使用を検討する価値があります。ZonedDateTime と OffsetDateTime は、java.sql.Timestamp、java.sql.Date、java.sql.Time の素晴らしい代替手段です。
接続の作成
認証情報と設定の供給
シンプルステートメント
挿入
HikariCP
詳細情報
詳細については、GitHub リポジトリ および Java Client ドキュメント をご覧ください。
トラブルシューティング
ロギング
ドライバーは slf4j を使用してロギングを行い、クラスパス上で最初に見つかった実装を使用します。
大きな挿入での 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 オプションを有効にしていることを確認する必要があります: