clickhouse通过java jdbc实现批量操作

1.1、在maven中引入clickhouse jar包

            <dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.5.0</version></dependency><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-client</artifactId><version>0.5.0</version></dependency><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-http-client</artifactId><version>0.5.0</version></dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.1</version></dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5-fluent</artifactId><version>5.1.3</version></dependency>

1.2、注意,httpclient5-fluent和httpclient5必须引入,否则会报错

1.3、编写一个DriverPropertyCreator 驱动接口

import java.sql.DriverPropertyInfo;
import java.util.Properties;public interface DriverPropertyCreator {DriverPropertyInfo createDriverPropertyInfo(Properties properties);
}

1.4、编写一个ClickHouseQueryParam枚举


import java.sql.DriverPropertyInfo;
import java.util.Locale;
import java.util.Properties;public enum ClickHouseQueryParam implements DriverPropertyCreator {DATABASE("database", null, String.class, "database name used by default"),USER("user", null, String.class, "user name, by default - default"),PASSWORD("password", null, String.class, "user password, by default null");private final String key;private final Object defaultValue;private final Class<?> clazz;private final String description;<T> ClickHouseQueryParam(String key, T defaultValue, Class<T> clazz, String description) {this.key = key;this.defaultValue = defaultValue;this.clazz = clazz;this.description = description;}public String getKey() {return key;}public Object getDefaultValue() {return defaultValue;}public Class<?> getClazz() {return clazz;}public String getDescription() {return description;}@Overridepublic String toString() {return name().toLowerCase(Locale.ROOT);}@Overridepublic DriverPropertyInfo createDriverPropertyInfo(Properties properties) {DriverPropertyInfo propertyInfo = new DriverPropertyInfo(key, driverPropertyValue(properties));propertyInfo.required = false;propertyInfo.description = description;propertyInfo.choices = driverPropertyInfoChoices();return propertyInfo;}private String[] driverPropertyInfoChoices() {return clazz == Boolean.class || clazz == Boolean.TYPE ? new String[] { "true", "false" } : null;}private String driverPropertyValue(Properties properties) {String value = properties.getProperty(key);if (value == null) {value = defaultValue == null ? null : defaultValue.toString();}return value;}
}

1.5、编写一个ClickHouseConnectionSettings枚举


import java.sql.DriverPropertyInfo;
import java.util.Properties;public enum ClickHouseConnectionSettings implements DriverPropertyCreator {SOCKET_TIMEOUT("socket_timeout", 30000, "");private final String key;private final Object defaultValue;private final String description;private final Class<?> clazz;ClickHouseConnectionSettings(String key, Object defaultValue, String description) {this.key = key;this.defaultValue = defaultValue;this.clazz = defaultValue.getClass();this.description = description;}public String getKey() {return key;}public Object getDefaultValue() {return defaultValue;}public Class<?> getClazz() {return clazz;}public String getDescription() {return description;}public DriverPropertyInfo createDriverPropertyInfo(Properties properties) {DriverPropertyInfo propertyInfo = new DriverPropertyInfo(key, driverPropertyValue(properties));propertyInfo.required = false;propertyInfo.description = description;propertyInfo.choices = driverPropertyInfoChoices();return propertyInfo;}private String[] driverPropertyInfoChoices() {return clazz == Boolean.class || clazz == Boolean.TYPE ? new String[] { "true", "false" } : null;}private String driverPropertyValue(Properties properties) {String value = properties.getProperty(key);if (value == null) {value = defaultValue == null ? null : defaultValue.toString();}return value;}
}

1.6、编写一个ClickHouseProperties类


import java.util.Properties;public class ClickHouseProperties {private String user;private String password;private String database;private int socketTimeout;public ClickHouseProperties() {this(new Properties());}public ClickHouseProperties(Properties info) {this.socketTimeout = (Integer) getSetting(info, ClickHouseConnectionSettings.SOCKET_TIMEOUT);this.database = getSetting(info, ClickHouseQueryParam.DATABASE);this.user = getSetting(info, ClickHouseQueryParam.USER);this.password = getSetting(info, ClickHouseQueryParam.PASSWORD);}public Properties asProperties() {PropertiesBuilder ret = new PropertiesBuilder();ret.put(ClickHouseConnectionSettings.SOCKET_TIMEOUT.getKey(), String.valueOf(socketTimeout));ret.put(ClickHouseQueryParam.USER.getKey(), user);ret.put(ClickHouseQueryParam.PASSWORD.getKey(), password);ret.put(ClickHouseQueryParam.DATABASE.getKey(), database);return ret.getProperties();}public ClickHouseProperties(ClickHouseProperties properties) {setUser(properties.user);setPassword(properties.password);setDatabase(properties.database);setSocketTimeout(properties.socketTimeout);}private <T> T getSetting(Properties info, ClickHouseQueryParam param) {return getSetting(info, param.getKey(), param.getDefaultValue(), param.getClazz());}private <T> T getSetting(Properties info, ClickHouseConnectionSettings settings) {return getSetting(info, settings.getKey(), settings.getDefaultValue(), settings.getClazz());}@SuppressWarnings("unchecked")private <T> T getSetting(Properties info, String key, Object defaultValue, Class<?> clazz) {String val = info.getProperty(key);if (val == null) {return (T) defaultValue;}if (clazz == int.class || clazz == Integer.class) {return (T) clazz.cast(Integer.valueOf(val));}if (clazz == long.class || clazz == Long.class) {return (T) clazz.cast(Long.valueOf(val));}if (clazz == boolean.class || clazz == Boolean.class) {final Boolean boolValue;if ("1".equals(val) || "0".equals(val)) {boolValue = "1".equals(val);} else {boolValue = Boolean.valueOf(val);}return (T) clazz.cast(boolValue);}return (T) clazz.cast(val);}public int getSocketTimeout() {return socketTimeout;}public void setSocketTimeout(int socketTimeout) {this.socketTimeout = socketTimeout;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getDatabase() {return database;}public void setDatabase(String database) {this.database = database;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}private static class PropertiesBuilder {private final Properties properties;public PropertiesBuilder() {properties = new Properties();}public void put(String key, String value) {if (value != null) {properties.put(key, value);}}public Properties getProperties() {return properties;}}
}

1.7、开始编写jdbc操作批量操作clickhouse的ClickhouseBatchDemo


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;import org.demoflowable.common.ClickHouseProperties;import com.clickhouse.jdbc.ClickHouseConnection;
import com.clickhouse.jdbc.ClickHouseDataSource;public class ClickhouseBatchDemo {private static String username = "default";private static String password = "123456";private static String address = "jdbc:clickhouse://192.168.42.142:8123";private static String db = "bigdata";private static int socketTimeout = 600000;public static void main(String[] args) throws Exception {getConnection();createTable("create table t_demo_04(id UInt32,sku String,amount Decimal(16,2),create_time Datetime) engine =MergeTree partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku);");batchInsertDemo();}/*** 创建表* * @throws Exception*/public static void createTable(String tableSql) throws Exception {Connection connection = null;try {connection = getConnection();Statement statement = connection.createStatement();boolean execute = statement.execute(tableSql);if (execute) {System.out.println("创建表成功," + execute);}} finally {close(connection);}}public static void batchInsertDemo() throws Exception {Connection connection = null;try {connection = getConnection();PreparedStatement pstmt = connection.prepareStatement("insert into t_demo_03 (id,sku,amount,create_time) values(?,?,?,?)");for (int i = 0; i < 10000; i++) {String id = "10" + i;String sku = "sku20231108" + i;pstmt.setString(1, id);pstmt.setString(2, sku);pstmt.setString(3, "50000.00");pstmt.setString(4, "2023-11-08 12:00:00");pstmt.addBatch();if (i % 500 == 0) {pstmt.executeBatch();pstmt.clearBatch();}pstmt.executeBatch();}System.out.println("clickhouse批量插入成功");} finally {close(connection);}}public static Connection getConnection() {ClickHouseProperties properties = new ClickHouseProperties();properties.setUser(username);properties.setPassword(password);properties.setDatabase(db);properties.setSocketTimeout(socketTimeout);try {ClickHouseDataSource clickHouseDataSource = new ClickHouseDataSource(address, properties.asProperties());ClickHouseConnection conn = clickHouseDataSource.getConnection();System.out.println("Clickhouse连接成功");return conn;} catch (SQLException e) {e.printStackTrace();}return null;}public static void close(Connection connection) {try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[100天算法】-搜索旋转排序数组 II(day 65)

题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如&#xff0c;数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true&#xff0c;否则返回 false。示例 1:输入: nums [2,5,6,0,0,1,2]…

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]

什么是机器学习中的特征提取&#xff1f; 特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…

软件测试/测试开发丨接口测试学习笔记,TcpDump与WireShark

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27859 协议分析工具 网络监听&#xff1a;TcpDump WireShark 代理 Proxy 推荐工具&#xff1a;手工测试charles [全平台]、安全测试burpsuite [全平台 j…

chrome安装vue devtools

不能访问应用商店 如果可以访问应用商店可以往下看 插件源代码 选择shell-chrome&#xff0c;这是官方的插件源码 下载源代码打包 参考教程 点击扩展按钮->管理扩展程序->打开开发者模式->把crx文件拖拽进去即可 可以访问chrome应用商店 插件地址 官方文档地址 选…

VSCode修改主题为Eclipse 绿色护眼模式

前言 从参加开发以来&#xff0c;一直使用eclipse进行开发&#xff0c;基本官方出新版本&#xff0c;我都会更新。后来出来很多其他的IDE工具&#xff0c;我也尝试了&#xff0c;但他们的主题都把我劝退了&#xff0c;黑色主题是谁想出来&#xff1f;&#x1f602; 字体小的时…

二维码智慧门牌管理系统升级解决方案:轻松实现辖区范围门址统计

文章目录 前言一、系统功能与优势 前言 在这个数字化时代&#xff0c;传统的门牌管理系统已经无法满足现代管理的需求。为了满足辖区内门址的统计需求&#xff0c;我们引入了全新的二维码智慧门牌管理系统升级解决方案。这一升级将让您轻松实现辖区范围门址的统计&#xff0c;…

第二十八章 车道线检测中的论文梳理(车道线感知)

近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 文章在这&#xff0c;实时更新&#xff0c;喜欢…

ubuntu 源码编译安装make过程很慢问题解决

一般下载的时候有两种方式 使用wget 下载后使用tar命令解压直接git clone 源代码 下载完成之后&#xff0c;进入目录&#xff0c;新建一个文件夹build&#xff0c;防止影响码源结构第三步&#xff0c;进入到build目录&#xff0c;使用cmake编译 cmake ..第四步直接make编译 …

开源的全能维护 U 盘工具:Ventoy

开源的全能维护 U 盘工具&#xff1a;Ventoy 本篇文章聊聊迄今为止&#xff0c;我用着最舒服的一款开源 U 盘启动工具&#xff0c;Ventoy。 写在前面 好久不见&#xff0c;接下来计划写一个比较连续的内容&#xff0c;就先从最小的处着手吧。 经过长久的折腾&#xff0c;除…

LLVM学习笔记(60)

4.4.3. X86Subtarget 在X86TargetMachine构造函数的105行调用了X86Subtarget构造函数来创建具体的目标机器对象。 4.4.3.1. FMV的支持&#xff08;v7.0&#xff09; V7.0将具体目标机器对象的生成推迟到第一次调用getSubtarget ()时才创建。不过&#xff0c;为了方便起见&am…

pytest 的使用===谨记

发现用例的规则 a) 文件test_.py开头和_test.py结尾 b) Test开头的类中test开头的方法&#xff08;测试类不能带有__init__方法&#xff09; c) 模块中test开头的函数&#xff08;可以不在class中&#xff09; 注意点&#xff1a; pytest是以方法为单位发现用例的&#xff0c;你…

@Bean有哪些属性

直接看原文 原文链接:Spring中bean标签的作用和属性的详解-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Bean的配置一般都在XML文件进行配置Bean相关包为&#xff1a;or…

吴恩达《机器学习》6-4->6-7:代价函数、简化代价函数与梯度下降、高级优化、多元分类:一对多

一、代价函数 逻辑回归的代价函数是用来度量模型预测与实际结果之间的差异的。与线性回归使用均方误差不同&#xff0c;逻辑回归使用的代价函数在数学上更为复杂。为了理解逻辑回归的代价函数&#xff0c;首先要明白逻辑回归的假设函数&#xff1a; ℎ&#x1d703;(&#x1…

激光雷达和人工智能

几十年来&#xff0c;激光雷达一直是许多行业中非常有用的工具&#xff0c;但直到最近&#xff0c;随着人工智能&#xff08;AI&#xff09;解决方案的引入&#xff0c;我们才开始认识到它的真正潜力。激光雷达&#xff0c;又称光探测和测距&#xff0c;是一种遥感技术。它利用…

React构建组件的方式有哪些?区别?

一、是什么 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式 在React中&#xff0c;一个类、一个函数都可以视为一个组件 在之前文章中&#xff0c;我们了解到组件所存在的优势&#xff1a; 降低整个系统的耦合度&am…

nginx下载安装和日志切割

目录 一、nginx安装配置 1.nginx版本 2.nginx安装配置 3.查看安装后的nginx 4.配置PATH变量 二、日志切割 1.给当前日志文件重命名 2.等待 3.写bash脚本 4.查看日志结果 5.加入crontab定时任务 结语 一、nginx安装配置 1.nginx版本 nginx如今分为商业版&#xff0…

imagettftext(): Could not find/open font 解决办法

问题&#xff1a;Captcha验证码不能正常显示&#xff0c;是因为使用GD库imagettftext()函数时&#xff0c;报“Warning: imagettftext(): Could not find/open font in ”警告 。 网上的解决方法: 将font路径的相对路径 转成 绝对路径即可 $fontfile "./fonts/*.ttf&q…

MaHDE

FHM means ‘fitness hierarchical mutation’&#xff0c;DGS means ‘directed global search’&#xff0c;ELS means ‘elite local search’ 辅助信息 作者未提供代码

使用数据分析,识别设备异常

设备健康监测系统在工业领域中扮演着至关重要的角色&#xff0c;它能够帮助企业及时发现设备异常&#xff0c;预防故障&#xff0c;提高设备使用寿命和生产效率。而异常诊断技术则是设备健康监测系统中的核心部分&#xff0c;能够实现对设备异常情况的准确判断。根据设备状态数…

高校为什么需要企业数据库?

随着信息化数字化的发展&#xff0c;企业数据库已经成为高校不可或缺的一部分。企业数据库一般整合了多维度企业数据信息。比如&#xff0c;艾思依托丰富的数据沉淀和领先的模型算法&#xff0c;打造“1N”产业大数据平台&#xff0c;包含“1个企业数据中心”一一涵盖全国2.4亿…