日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何將Mybatis連接到ClickHouse

瀏覽:243日期:2023-10-19 16:26:33
場景

最近在做數據分析項目,里面有這樣一個業務:把匹配的數據打上標簽,放到新的索引中。

數據量:累計億級的數據

使用場景:可能會單次查詢大量的數據,但不會設置復雜的條件,且這些數據不會被再次修改

原來使用的數據庫:ElasticSearch

問題:上面也說了我這里打上標記后,這些數據幾乎不會再修改了。ES 是一個全文檢索引擎,更適用于進行大量文本檢索的情況。這里與我上面的使用場景就不太匹配了。

技術選型的考慮:改用戰斗民族開發的 ClickHouse,它適用于 OLAP 也就是數據分析的場景,當數據寫入后,通過不同維度不斷挖掘、分析,發現其中的商業價值。ClickHouse 適用于讀遠大于寫的情況。

此外,相比ES,ClickHouse 占用的硬盤空間更小,也有利于降低運維成本。

下面是我在嘗試接入 ClickHouse 時的一些實踐,以及關于 ClickHouse數組類型轉換問題的解決方案。

關于 ClickHouse 更詳細的知識參考:https://zhuanlan.zhihu.com/p/98135840

示例代碼已經上傳到了 Git,目前更新第 28 節:https://github.com/laolunsi/spring-boot-examples/

Mybatis + ClickHouse

以前一直用 Mybatis 去操作 MySQL,其實 Mybatis 還可以操作 ClickHouse,這里用 Druid 進行連接管理。

maven 配置

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.2.6</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency>

配置文件:

spring: datasource: type: com.alibaba.druid.pool.DruidDataSource # 注意這里是自定義的配置,通過 JdbcParamConfig 來加載配置到 Spring 中 # 然后由 DruidConfig 來配置數據源 click: driverClassName: ru.yandex.clickhouse.ClickHouseDriver url: jdbc:clickhouse://127.0.0.1:8123/test # ip:port/database userName: default password: default # 按照自己連接的 clickhouse 數據庫來 initialSize: 10 maxActive: 100 minIdle: 10 maxWait: 6000 validationQuery: SELECT 1

加載配置項的類:

@Component@ConfigurationProperties(prefix = 'spring.datasource.click')public class JdbcParamConfig { private String userName; private String password; private String driverClassName ; private String url ; private Integer initialSize ; private Integer maxActive ; private Integer minIdle ; private Integer maxWait ; private String validationQuery; // ignore getters and setters}

配置 Druid:

@Configuration@MapperScan(basePackages = { 'com.aegis.analysis.clickhousestorage.dao'})public class DruidConfig { @Resource private JdbcParamConfig jdbcParamConfig ; @Bean(name = 'clickDataSource') public DataSource dataSource() throws ClassNotFoundException { Class classes = Class.forName('com.alibaba.druid.pool.DruidDataSource'); DruidDataSource dataSource = (DruidDataSource) DataSourceBuilder.create().driverClassName(jdbcParamConfig.getDriverClassName()).type(classes).url(jdbcParamConfig.getUrl()).username(jdbcParamConfig.getUserName()).password(jdbcParamConfig.getPassword()).build(); dataSource.setMaxWait(jdbcParamConfig.getMaxWait()); dataSource.setValidationQuery(jdbcParamConfig.getValidationQuery()); return dataSource; } @Bean public SqlSessionFactory clickHouseSqlSessionFactoryBean() throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(dataSource()); // 實體 model的 路徑 比如 com.order.model factory.setTypeAliasesPackage('com.example.clickhousedemo.model'); //添加XML目錄 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factory.setMapperLocations(resolver.getResources('classpath:mapper/*.xml')); //開啟駝峰命名轉換 factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); return factory.getObject(); }}

定義一個 UserInfo 類,建表語句如下:

CREATE TABLE test.user ( `id` Int16, `name` String, `score` Float32, `score2` Float64, `state` Int8, `createTime` DateTime, `ranks` Array(UInt8) ) ENGINE = MergeTree() ORDER BY id;

實體類:

public class UserInfo { private Integer id; // int16 private String name; // String private Float score; // float16 private Double score2; // float32 private Boolean state; // int8 private Date createTime; // datetime private Integer[] ranks; // Array - Array 類型需要進行類型轉換 // 具體轉換方法與配置參考 ClickArrayToIntHandler 類與 UserMapper.xml 中關于查詢和插入時 ranks 字段的配置 // ignore getters and setters}

DAO 和 Mapper 文件就按照連接 MYSQL 時的寫法一樣。

這里有個需要注意的點,ClickHouse 有個 Array 類型,可以用來存數組,就像 ES 一樣。問題是類型轉換需要自己定義。網上一些資料僅列出了基本類型的場景,我自己實現了一個轉換器,可以參考一下:

/** * Java Int 數組與 ClockHouse Array Int 轉換器 * @version 1.0 * @since 2019/11/14 9:59 */public class ClickArrayToIntHandler extends BaseTypeHandler<Integer[]> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Integer[] integers, JdbcType jdbcType) throws SQLException { preparedStatement.setObject(i, integers); } @Override public Integer[] getNullableResult(ResultSet resultSet, String s) throws SQLException { Object obj = resultSet.getObject(s); return parseClickHouseArrayToInt(obj); } @Override public Integer[] getNullableResult(ResultSet resultSet, int i) throws SQLException { Object obj = resultSet.getObject(i); return parseClickHouseArrayToInt(obj); } @Override public Integer[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException { Object obj = callableStatement.getObject(i); return parseClickHouseArrayToInt(obj); } private Integer[] parseClickHouseArrayToInt(Object obj) { if (obj instanceof ClickHouseArray) { int[] res = new int[0]; try {res = (int[]) ((ClickHouseArray) obj).getArray(); } catch (SQLException ex) {ex.printStackTrace(); } if (res != null && res.length > 0) {Integer[] resI = new Integer[res.length];for (int i = 0; i < res.length; i++) { resI[i] = res[i];}return resI; } } return new Integer[0]; }}

DAO.xml 也給一個示例:

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='com.aegis.analysis.clickhousestorage.dao.UserInfoMapper'> <resultMap type='com.example.clickhousedemo.model.UserInfo'> <id column='id' property='id' /> <result column='name' property='name' /> <result column='name' property='name' /> <result column='score' property='score' /> <result column='score2' property='score2' /> <result column='state' property='state' /> <result column='createTime' property='createTime' /> <!-- <result column='ranks' property='ranks' jdbcType='JAVA_OBJECT' javaType='java.lang.Object' />--> <result column='ranks' property='ranks' typeHandler='com.example.clickhousedemo.dao.ClickArrayToIntHandler' /> </resultMap> <sql id='Base_Column_List'> * </sql> <insert parameterType='com.aegis.analysis.clickhousestorage.model.UserInfo' > INSERT INTO user (id,name, score, score2, state, createTime, ranks) VALUES (#{id},#{name}, #{score}, #{score2}, #{state}, #{createTime}, #{ranks, jdbcType=ARRAY, typeHandler=com.example.clickhousedemo.dao.ClickArrayToIntHandler}) </insert> <select resultMap='BaseResultMap'> select <include refid='Base_Column_List' /> from user where id = #{id} limit 1 </select> <select resultMap='BaseResultMap' > select <include refid='Base_Column_List' /> from user </select></mapper>

具體代碼可以去我的 Git 倉庫里查看,還有 SpringBoot 整合其他中間件技術的示例,歡迎 Star!

https://github.com/laolunsi/spring-boot-examples

以上就是如何將Mybatis連接到ClickHouse的詳細內容,更多關于Mybatis連接到ClickHouse的資料請關注好吧啦網其它相關文章!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
丝袜国产日韩另类美女| 综合在线一区| 日韩高清不卡| 国产麻豆综合| 婷婷色综合网| 国产精品成人3p一区二区三区| 蜜臀av一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 免费一级欧美片在线观看网站| 欧美一区成人| 国产精品对白| 麻豆亚洲精品| 夜夜嗨一区二区| 麻豆国产精品| 久久伊人久久| 97视频热人人精品免费| 日韩成人精品一区| 欧美精品日日操| 日韩高清不卡一区二区| 日韩在线不卡| 欧美视频一区| 国产精品www.| 中文字幕在线官网| 国产欧美日韩视频在线| 国产精品1区| 日韩中文字幕无砖| 特黄毛片在线观看| 欧美日韩一区二区三区四区在线观看 | 日韩激情一区| 老色鬼久久亚洲一区二区| 国产精品久久久免费| 国产精品对白久久久久粗| 成人在线视频区| 国产精品久久久久久久久久妞妞| 亚洲精品91| 成午夜精品一区二区三区软件| 日韩一二三区在线观看| 国产精品主播在线观看| 亚洲精品裸体| 在线综合亚洲| 日韩av在线播放中文字幕| 最新亚洲国产| 久久成人av| 国产乱人伦精品一区| 蜜桃91丨九色丨蝌蚪91桃色| 国产香蕉精品| 成人小电影网站| 免费视频久久| 国产乱人伦丫前精品视频| 亚洲涩涩在线| 亚洲精品伦理| 日本久久成人网| 日本电影久久久| 日韩动漫一区| 天堂中文在线播放| 亚洲精品人人| 国产精品字幕| 亚洲国产影院| 亚洲va中文在线播放免费| 国产精品毛片在线看| 亚洲精品一区二区在线看| 日韩欧美午夜| 亚洲1区在线| 日本在线视频一区二区| 国产成人精品一区二区三区免费| 美女高潮久久久| 国产精品最新自拍| 国产精品一区2区3区| 久久久久国产精品一区二区| 蜜桃视频一区二区三区在线观看| 精品国产一区二| 欧美一区自拍| 日韩欧美精品一区| 国产欧美日韩视频在线| 国产精品三p一区二区| 99国产精品免费视频观看| 91精品美女| 国产精品色网| 国产精品精品| 国产精品久久免费视频| 精品国产午夜肉伦伦影院| 鲁大师精品99久久久| 国产成人精品福利| 欧美日韩精品一区二区三区视频 | 日韩中文字幕区一区有砖一区 | 日韩二区在线观看| 亚洲黄色影院| 夜夜嗨一区二区三区| 久久国产精品毛片| 欧美国产先锋| 日韩影院二区| 影音国产精品| 麻豆mv在线观看| 婷婷中文字幕一区| 日韩一区精品视频| 青青草伊人久久| 国产毛片一区| 久久激情综合网| 国产毛片久久| 麻豆国产一区| 亚洲美女91| 亚洲欧美日韩国产一区二区| 精品捆绑调教一区二区三区 | 国产精品毛片久久久| 7m精品国产导航在线| 九色精品91| 日本不卡一区二区三区| 欧美国产亚洲精品| 亚洲a在线视频| 最新国产精品视频| 欧美+亚洲+精品+三区| 久久久成人网| 日本一不卡视频| 日本一二区不卡| 久久精品国产久精国产爱| 欧美sss在线视频| 超碰在线99| 国产成人精品一区二区免费看京 | 国产在线观看www| 四虎国产精品免费观看| 日韩一级不卡| 国产探花在线精品| 欧美日韩国产v| 日韩伦理在线一区| 亚洲欧洲国产精品一区| 久久这里只有| 女主播福利一区| 亚洲大片在线| 欧美日韩国产免费观看| 合欧美一区二区三区| 国产精品99久久久久久董美香| 91福利精品在线观看| 国产视频一区二| 久久精品福利| 在线国产精品一区| 日韩av二区| 无码日韩精品一区二区免费| 丰满少妇一区| 成人国产精品| 日韩三级久久| 精品在线播放| 丝袜美腿一区二区三区| 亚洲精选成人| 亚洲黄色中文字幕| 亚洲97av| 欧美亚洲三区| 国产精品不卡| 久久国产电影| 国产一区丝袜| 日韩成人三级| 欧美国产免费| 美国欧美日韩国产在线播放| 日日摸夜夜添夜夜添国产精品| 国产日韩欧美一区二区三区| 国产精品亚洲片在线播放| 亚洲综合婷婷| 国产日韩一区二区三区在线播放| 日韩av在线播放网址| 国产极品一区| 亚洲人妖在线| 在线成人直播| 欧美好骚综合网| 欧美亚洲tv| 成人精品久久| 伊人久久亚洲影院| 欧美日韩亚洲一区二区三区在线| 丝袜美腿亚洲色图| 日韩avvvv在线播放| 久久精品国产亚洲aⅴ| 亚洲伦乱视频| 亚洲日本欧美| 日韩中文字幕1| 神马日本精品| 久久av免费看| 欧美日韩中出| 亚洲精品黄色| 国产精品99久久免费观看| 91精品在线观看国产| 亚洲欧洲美洲av| 国产在线观看91一区二区三区| 欧美日韩激情| 国产精品www.| 91久久黄色| 国产精品一线| 999国产精品视频| 欧美一级二级视频| 国产无遮挡裸体免费久久| 亚洲精品裸体| 裤袜国产欧美精品一区| 亚洲精品韩国| 蜜桃av一区二区三区电影| 亚洲精品成人| 国产精品自在| 国产精品美女| 日本一二区不卡| 日本欧美一区| 亚洲精品一区二区在线看| 欧美日韩精品一本二本三本| 日韩精品一级| 欧美一级精品|