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:8123
jdbc: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 オプションを有効にしていることを確認する必要があります: