JDBC ドライバー
clickhouse-jdbc は、最新の Java クライアントを用いて標準的な JDBC インターフェースを実装しています。
パフォーマンスや直接アクセスが重要な場合は、最新の Java クライアントを直接使用することを推奨します。
0.7.x からの変更点
0.8 では、ドライバーが JDBC 仕様により厳密に従うようにすることを目指したため、影響が出る可能性のある削除された機能があります:
| 旧機能 | 備考 |
|---|---|
| トランザクションサポート | ドライバーの初期バージョンでは、トランザクションサポートは 擬似的に 実装されており、予期しない結果を招く可能性がありました。 |
| レスポンス列名の変更 | ResultSet は変更可能でしたが、効率性の観点から現在は読み取り専用になっています。 |
| 複数ステートメント SQL | 複数ステートメントのサポートは 擬似的に 実装されていただけであり、現在は 1 回の呼び出しにつき 1 ステートメントのみを厳密にサポートする実装になっています。 |
| 名前付きパラメータ | JDBC 仕様の一部ではありません。 |
ストリームベースの PreparedStatement | ドライバーの初期バージョンでは、PreparedStatement を JDBC 以外の用途で使用することが可能でした。そのようなオプションを希望する場合は、Java Client およびその examples を参照することを推奨します。 |
Date はタイムゾーンなしで保存される一方、DateTime はタイムゾーン付きで保存されます。注意しないと予期しない結果を招く可能性があります。
環境要件
- OpenJDK バージョン 8 以上
セットアップ
- Maven
- Gradle (Kotlin)
- Gradle
設定
Driver Class: 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 クライアント が提供する ClickHouse 固有のプロパティをサポートします。
可能な場合、サポートされていない機能に対しては、メソッドは SQLFeatureNotSupportedException をスローします。その他のカスタムプロパティには次のものがあります:
| Property | Default | 説明 |
|---|---|---|
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 ドライバーは、基盤となっている Java クライアント と同じデータ形式をサポートします。
日付、時刻、タイムゾーンの扱い
java.sql.Date、java.sql.Time、java.sql.Timestamp はタイムゾーンの計算を複雑にする原因となり得ます。もちろんサポートはされていますが、
java.time パッケージの利用を検討することをお勧めします。ZonedDateTime と
OffsetDateTime は、java.sql.Timestamp、java.sql.Date、java.sql.Time を置き換える優れた選択肢です。
接続の作成
認証情報と設定の提供
シンプルなステートメント
INSERT 文
HikariCP
詳細情報
詳細については、GitHub リポジトリおよび Java クライアントのドキュメントを参照してください。
トラブルシューティング
ロギング
ドライバーはログ出力に slf4j を使用し、classpath 上で最初に見つかった利用可能な実装を使用します。
大量挿入時の JDBC タイムアウトの解消
ClickHouse に対して実行時間の長い大量挿入処理を行う際、次のような JDBC タイムアウトエラーが発生する場合があります:
これらのエラーはデータ挿入処理を妨げ、システムの安定性に影響を与える可能性があります。この問題に対処するには、クライアント OS 側のいくつかのタイムアウト設定を調整する必要が生じる場合があります。
Mac OS
Mac OS では、次の設定を調整することで問題を解消できます。
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 オプションが有効になっていることを確認してください。