当前位置: 首页 > news >正文

封装clickHouse线程池与ibeetl解析SQL并对结果转进行转化

线程池配置

import com.cloudwise.dcim.common.utils.ClickHouseConnectionPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author cheng* @className ClickHousePoolConfig* @date 2024/08/15 11:11**/
@Configuration
public class ClickHousePoolConfig {@Value("${chServers}")private String servers;@Value("${chHttpPort}")private Integer port;@Value("${chUsername}")private String user;@Value("${chPassword}")private String password;@Bean("clickHouseConnectionPool")public ClickHouseConnectionPool chConnectionPool(){String clickHouseUrl = "jdbc:clickhouse://"+servers+":"+port;//clickHouseUrl = "jdbc:clickhouse://"+servers+":"+port+"/cw_db";GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();/*** maxTotal: 池中最大活动对象数,如果设置为负值,则表示没有限制。** maxIdle: 池中最大空闲对象数,如果设置为负值,则表示没有限制。** minIdle: 池中最小空闲对象数。** maxWaitMillis: 当池中没有可用对象时,最大等待时间(以毫秒为单位),如果超时,将抛出 NoSuchElementException 异常。设置为-1表示无限等待。** testOnCreate: 对象被创建时是否进行检测,如果检测失败则对象被销毁。** testOnBorrow: 对象被借用时是否进行检测,如果检测失败则重新尝试借用或返回Null。** testOnReturn: 对象被归还时是否进行检测,如果检测失败则对象被销毁。** testWhileIdle: 是否启用空闲对象检测,如果启用,则一个空闲对象检测线程会周期性地运行。** timeBetweenEvictionRunsMillis: 空闲对象检测的运行间隔时间(以毫秒为单位),如果设置为负值,则不运行空闲对象检测线程。** numTestsPerEvictionRun: 每次空闲对象检测运行中最大检测对象数。*/// 配置连接池参数,例如最大连接数、最大空闲时间等poolConfig.setMaxTotal(10);poolConfig.setMaxIdle(5);poolConfig.setMinIdle(2);poolConfig.setMaxWaitMillis(-1);poolConfig.setTestOnBorrow(true);poolConfig.setTestOnReturn(false);poolConfig.setTestWhileIdle(false);ClickHouseConnectionPool connectionPool = new ClickHouseConnectionPool(clickHouseUrl, poolConfig,user,password);//Connection connection = connectionPool.getConnection();return connectionPool;}
}

连接数据库配置

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import ru.yandex.clickhouse.ClickHouseDataSource;
import ru.yandex.clickhouse.settings.ClickHouseProperties;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/*** @author cheng* @className ClickHouseConnectionPool* @date 2024/08/15 10:37**/
public class ClickHouseConnectionPool {private final GenericObjectPool<Connection> connectionPool;public ClickHouseConnectionPool(String clickHouseUrl, GenericObjectPoolConfig poolConfig,String user,String paassword) {// 创建ClickHouse连接属性ClickHouseProperties properties = new ClickHouseProperties();properties.setUser(user); // 设置用户名properties.setPassword(paassword); // 设置密码// 设置自动提交为true//properties.setAutoCommit(true);ClickHouseDataSource dataSource = new ClickHouseDataSource(clickHouseUrl,properties);connectionPool = new GenericObjectPool<>(new ClickHouseConnectionFactory(dataSource), poolConfig);}public Connection getConnection() throws SQLException {try {return connectionPool.borrowObject();} catch (Exception e) {throw new SQLException("Could not get a connection", e);}}public void returnConnection(Connection conn) {if (conn != null) {connectionPool.returnObject(conn);}}private static class ClickHouseConnectionFactory extends BasePooledObjectFactory<Connection> {private final DataSource dataSource;public ClickHouseConnectionFactory(DataSource dataSource) {this.dataSource = dataSource;}@Overridepublic Connection create() throws Exception {return dataSource.getConnection();}@Overridepublic PooledObject<Connection> wrap(Connection connection) {return new DefaultPooledObject<>(connection);}}
}

clickhouse查找数据工具

import cn.hutool.json.JSONUtil;
import com.cloudwise.dcim.common.exception.BaseException;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** ck 查找数据* @author cheng* @className ClickHouseQueryUtils* @date 2024/08/15 11:20**/
public class ClickHouseQueryUtils {/*** 无需转化指定实体类* @param sql* @return*/public static List<Map<String,Object>> querySelect(String sql){ClickHouseConnectionPool connectionPool =  SpringHoldUtil.getBean(ClickHouseConnectionPool.class);Connection connection = null;//输入动态参数//PreparedStatement preparedStatement = null;//Statement statement = null;// ResultSet resultSet = null;List<Map<String, Object>> dataMap = null;// 使用connection执行操作try {connection = connectionPool.getConnection();//preparedStatement = connection.prepareStatement() ;//statement = connection.createStatement();sql = BeetlTemplateUtils.render(sql,null);//resultSet= statement.executeQuery(sql);try(Statement statement = connection.createStatement()){try (ResultSet resultSet = statement.executeQuery(sql)) {// 处理结果集dataMap = convert(resultSet);}}}catch (SQLException e){throw  new BaseException(e);}finally {
//            try {
//                if (resultSet != null) {
//                    resultSet.close();
//                }
//                if (statement != null) {
//                    statement.close();
//                }
//            } catch (SQLException e) {
//                throw  new BaseException(e);
//            }if(connection!=null) {connectionPool.returnConnection(connection);}}return  dataMap;}/*** 需转化指定实体类* @param sql* @param cls* @param <T>* @return*/public static  <T> List<T> querySelect(String sql,Class<T> cls) {List<Map<String, Object>> dataMap =  querySelect(sql);if(dataMap!=null&&!dataMap.isEmpty()) {return (List<T>) JSONUtil.toList(JSONUtil.toJsonStr(dataMap), cls);}return  null;}/**** 模版参数需转化指定实体类* @param sqlTemplate* @param params* @param cls* @param <T>* @return*/public static <T> List<T> querySelect(String sqlTemplate, Map<String,Object> params,Class<T> cls){String sql = BeetlTemplateUtils.render(sqlTemplate,params);return querySelect(sql,cls);}private static List<Map<String, Object>> convert(ResultSet rs) throws SQLException {ResultSetMetaData md = rs.getMetaData();int columns = md.getColumnCount();List<Map<String, Object>> list = new ArrayList<>();while (rs.next()) {Map<String, Object> row = new HashMap<>(columns);for (int i = 1; i <= columns; ++i) {row.put(md.getColumnName(i), rs.getObject(i));}list.add(row);}return list;}
}

模版解析工具

import org.beetl.core.Configuration;
import org.beetl.core.GroupTemplate;
import org.beetl.core.Template;
import org.beetl.core.resource.StringTemplateResourceLoader;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author derek* @className BeetlTemplateUtils* @date 2024/08/15 14:19**/
public class BeetlTemplateUtils {private static GroupTemplate gt;static {//初始化代码StringTemplateResourceLoader resourceLoader = new StringTemplateResourceLoader();Configuration cfg = null;try {cfg = Configuration.defaultConfiguration();} catch (IOException e) {e.printStackTrace();}gt = new GroupTemplate(resourceLoader, cfg);}public static String render(String template, Map<String,? extends Object> params){//获取模板Template t = gt.getTemplate(template);if(params!=null&&!params.isEmpty()){params.forEach((key,value)->{t.binding(key, value);});}return  t.render();}public static void main(String[] args) throws IOException {String template = "hello,${name}";Map<String,String> params = new HashMap<>();params.put("name","Lucy");// 输出渲染后的字符串System.out.println(BeetlTemplateUtils.render(template,params));}
}

依赖jar

<dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.2-patch11</version><scope>compile</scope></dependency><dependency><groupId>com.ibeetl</groupId><artifactId>beetl-core</artifactId></dependency>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监控电脑屏幕被拍照的原理是什么?如此有趣的电脑防偷窥知识,你一学就会!
  • MAC 终端上传文件到云服务器
  • 【银河麒麟高级服务器操作系统】libtirpc-devel 安装问题分析
  • 英国与日本经济数据影响市场走势
  • allegro PCB设计心得笔记(四) -- 显示坐标原点和更改默认产品选项
  • 计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
  • Qt实现中英文切换中QMessageBox中的中文信息怎么处理
  • uniapp基础知识【搬代码】
  • vue播放flv视频流
  • ASP.NET Core Web API 使用Autofac框架
  • 内网穿透工具Cpolar 食用指南
  • 2024/8/15 不上电测伺服端子是否正常
  • EMC学习笔记2——电磁兼容问题分析
  • 【IMR、TBR、TBDR】【RenderTexture、Cbuffer】学习
  • 不用高深的数学知识来理解 LLMs 是如何工作的
  • 【前端学习】-粗谈选择器
  • CSS居中完全指南——构建CSS居中决策树
  • JavaScript 基础知识 - 入门篇(一)
  • javascript面向对象之创建对象
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Logstash 参考指南(目录)
  • Mybatis初体验
  • opencv python Meanshift 和 Camshift
  • quasar-framework cnodejs社区
  • SQL 难点解决:记录的引用
  • vuex 学习笔记 01
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从零开始学习部署
  • 对超线程几个不同角度的解释
  • 对象管理器(defineProperty)学习笔记
  • 基于web的全景—— Pannellum小试
  • 漂亮刷新控件-iOS
  • 如何利用MongoDB打造TOP榜小程序
  • 算法系列——算法入门之递归分而治之思想的实现
  • 提醒我喝水chrome插件开发指南
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 项目实战-Api的解决方案
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #QT(串口助手-界面)
  • #QT(智能家居界面-界面切换)
  • (2022 CVPR) Unbiased Teacher v2
  • (3) cmake编译多个cpp文件
  • (7)svelte 教程: Props(属性)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (HAL库版)freeRTOS移植STMF103
  • (rabbitmq的高级特性)消息可靠性
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)硬币问题
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径