Apache Calcite - calcite jdbc驱动使用场景
前言
在使用Calcite查询数据时通常会用到这些代码获取schema
Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
但是并不是使用Calcite的场景都需要这样用,例如作为作为查询优化器或解析器使用,就不需要通过Caclite JDBC驱动来访问数据源。
查询优化器或解析器场景不使用驱动
如果你只是使用 Calcite 来进行 SQL 解析、验证、优化等操作,而不需要通过 JDBC 接口来访问数据源,那么你并不需要使用 JDBC 连接代码。你可以直接使用 Calcite 提供的 API 来构建和操作查询计划。例如,使用 Frameworks 工具类来创建 Calcite 的环境和配置。解析器解析Sql的场景比较常见,下文不进行演示。
@Testpublic void testSqlToRelNode() throws Exception{Properties info = new Properties();SchemaPlus rootSchema = Frameworks.createRootSchema(true);Schema schema = new AbstractSchema() {};rootSchema.add("MY_SCHEMA", schema);Table yourTable = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要动态分析表,那么就自己去创建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("name", typeFactory.createJavaType(String.class)).add("age", typeFactory.createJavaType(int.class)).build();}};Table department_table = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要动态分析表,那么就自己去创建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("department", typeFactory.createJavaType(String.class)).add("location", typeFactory.createJavaType(String.class)).build();}};rootSchema.getSubSchema("MY_SCHEMA").add("your_table", yourTable);rootSchema.getSubSchema("MY_SCHEMA").add("department_table", department_table);SqlParser.Config parserConfig = SqlParser.config().withLex(Lex.MYSQL).withConformance(SqlConformanceEnum.MYSQL_5);Frameworks.createRootSchema(true);FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(parserConfig).defaultSchema(rootSchema.getSubSchema("MY_SCHEMA")) // 使用自定义Schema.build();Planner planner = Frameworks.getPlanner(config);String sql = "SELECT A.id, A.name FROM (SELECT id,name FROM your_table WHERE age > 30 ) A JOIN (SELECT id, department FROM department_table WHERE location = 'NY' ) B ON A.id = B.id WHERE A.id > 100 ";
// String sql = "SELECT * FROM your_table where id = 1 and name = 'you_name'";SqlNode sqlNode = planner.parse(sql);SqlNode validatedSqlNode = planner.validate(sqlNode);RelRoot relRoot = planner.rel(validatedSqlNode);RelNode rootRelNode = relRoot.rel;System.out.println(rootRelNode.explain());HepProgram hepProgram = new HepProgramBuilder().addRuleInstance(CoreRules.FILTER_PROJECT_TRANSPOSE).addRuleInstance(CoreRules.FILTER_INTO_JOIN).addRuleInstance(CoreRules.FILTER_AGGREGATE_TRANSPOSE).addRuleInstance(CoreRules.FILTER_SET_OP_TRANSPOSE).addRuleInstance(CoreRules.PROJECT_FILTER_TRANSPOSE).addRuleInstance(CoreRules.PROJECT_JOIN_TRANSPOSE).build();// 创建HepPlannerHepPlanner hepPlanner = new HepPlanner(hepProgram);// 设置根RelNodehepPlanner.setRoot(rootRelNode);// 进行优化RelNode optimizedRelNode = hepPlanner.findBestExp();// 输出优化后的RelNodeSystem.out.println("优化后的RelNode: \n" + optimizedRelNode.explain());// 使用RelToSqlConverter将优化后的RelNode转换回SQLRelToSqlConverter relToSqlConverter = new RelToSqlConverter(MysqlSqlDialect.DEFAULT);Result result = relToSqlConverter.visitRoot(optimizedRelNode);SqlNode sqlNodeConverted = result.asStatement();//使用SqlPrettyWriter格式化SQLSqlPrettyWriter writer = new SqlPrettyWriter();String convertedSql = writer.format(sqlNodeConverted);//输出转换后的SQLSystem.out.println("优化后的SQL: " + convertedSql);}
Frameworks.createRootSchema(true) 是 Apache Calcite 中用于创建一个根模式(schema)的方法。它的作用和参数含义如下:
Frameworks.createRootSchema(true) 的含义
-
方法作用:该方法用于创建一个新的根模式(SchemaPlus),这是一个可以包含多个子模式和表的顶层容器。在 Calcite 中,模式(schema)用于组织和访问数据库对象,如表、视图和函数。
-
参数说明:
- boolean addMetadataSchema: 这个布尔参数决定是否在创建的根模式中添加一个默认的元数据模式(metadata schema)。true:表示在创建的根模式中包含一个名为 “metadata” 的子模式。这个子模式可以包含一些系统表或视图,用于访问数据库的元数据。false:表示不添加这样的元数据模式。
-
使用场景
- 默认环境设置:当你在使用 Calcite 进行查询解析、验证和优化时,需要一个模式来组织和访问数据。通过 createRootSchema(true),你可以快速创建一个包含元数据的根模式,便于进行一些系统级别的查询和管理。
- 自定义环境:如果你希望手动管理哪些模式和表可用,并且不需要系统元数据,可以将参数设置为 false,以获得一个更简洁的根模式。
作为JDBC驱动使用
如果你希望通过 JDBC 接口来使用 Calcite,那么确实需要使用类似于
DriverManager.getConnection(“jdbc:calcite:”, info);
的代码来建立数据库连接。通过这种方式,你可以像使用其他数据库一样,使用标准的 SQL 查询和 JDBC 操作来访问 Calcite。
JDBC 规范
JDBC(Java Database Connectivity)协议规范是Java平台的一部分,它定义了一组标准API,允许Java应用程序与各种数据库进行交互。
JDBC(Java Database Connectivity)和驱动程序(Driver)之间的关系是密切相关的,驱动程序是实现JDBC功能的核心组件。
驱动程序是一个实现JDBC接口的具体类库,通常由数据库厂商提供。负责将JDBC API调用转换为数据库特定的调用。它充当Java应用程序与数据库之间的桥梁。
Calcite驱动
为了基于JDBC接口来执行sql,calcite就需要实现自己的驱动。最终注册在驱动管理器中进行使用。JDBC 驱动实现逻辑在 org.apache.calcite.jdbc包下。按照规范需要实现下列基础能力:
实现步骤
- 实现Driver接口:这是JDBC驱动程序的入口。需要实现java.sql.Driver接口,并注册驱动程序。
- 实现Connection接口:负责管理与数据库的连接。实现java.sql.Connection接口的方法以支持事务管理、关闭连接等功能。
- 实现Statement接口:用于执行SQL查询。需要实现java.sql.Statement接口,支持执行SQL语句并返回结果。
- 实现ResultSet接口:用于处理查询结果。实现java.sql.ResultSet接口以提供对结果集的访问。
样板代码:
import java.sql.*;
import java.util.Properties;
import java.util.logging.Logger;// 1. Implement the Driver interface
public class MyMemoryDriver implements Driver {static {try {DriverManager.registerDriver(new MyMemoryDriver());} catch (SQLException e) {e.printStackTrace();}}@Overridepublic Connection connect(String url, Properties info) throws SQLException {if (acceptsURL(url)) {return new MyMemoryConnection();}return null;}@Overridepublic boolean acceptsURL(String url) throws SQLException {return url.startsWith("jdbc:mymemory:");}@Overridepublic DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {return new DriverPropertyInfo[0];}@Overridepublic int getMajorVersion() {return 1;}@Overridepublic int getMinorVersion() {return 0;}@Overridepublic boolean jdbcCompliant() {return false;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}
}// 2. Implement the Connection interface
class MyMemoryConnection implements Connection {@Overridepublic Statement createStatement() throws SQLException {return new MyMemoryStatement();}// Implement other methods of Connection...@Overridepublic void close() throws SQLException {// Close the connection}@Overridepublic boolean isClosed() throws SQLException {return false;}// Other methods...
}// 3. Implement the Statement interface
class MyMemoryStatement implements Statement {@Overridepublic ResultSet executeQuery(String sql) throws SQLException {return new MyMemoryResultSet();}// Implement other methods of Statement...@Overridepublic void close() throws SQLException {// Close the statement}// Other methods...
}// 4. Implement the ResultSet interface
class MyMemoryResultSet implements ResultSet {@Overridepublic boolean next() throws SQLException {return false; // Simulate no data}// Implement other methods of ResultSet...@Overridepublic void close() throws SQLException {// Close the result set}// Other methods...
}
Driver接口的实现类
org.apache.calcite.jdbc.Driver
在静态代码块中完成注册
public class Driver extends UnregisteredDriver {public static final String CONNECT_STRING_PREFIX = "jdbc:calcite:";protected final @Nullable Supplier<CalcitePrepare> prepareFactory;static {new Driver().register();}
/** org.apache.calcite.avatica.UnregisteredDriver类* Registers this driver with the driver manager.*/protected void register() {try {DriverManager.registerDriver(this);} catch (SQLException e) {System.out.println("Error occurred while registering JDBC driver "+ this + ": " + e.toString());}}
其余实现
- connection: org.apache.calcite.jdbc.CalciteConnectionImpl
- Statement:org.apache.calcite.jdbc.CalcitePreparedStatement
- ResultSet: org.apache.calcite.jdbc.CalciteResultSet
通过URL发现驱动
DriverManager.getConnection(“jdbc:calcite:”, info);
URL在JDBC的上下文中,主要作用是帮助DriverManager识别并选择合适的JDBC驱动程序。
- 识别驱动程序:DriverManager使用提供的JDBC URL来查找合适的驱动程序。JDBC URL的格式通常为jdbc:subprotocol:subname。在这个例子中,"jdbc:calcite:"中的"calcite"是用于标识Calcite的子协议。DriverManager通过这个标识来匹配已经注册的驱动程序。
- 加载驱动程序:一旦找到匹配的驱动程序,DriverManager会使用该驱动程序来尝试建立连接。
驱动程序需要实现java.sql.Driver接口的connect方法,该方法会检查URL是否是它所支持的格式,并根据URL和属性信息创建并返回一个Connection对象。 - 建立连接:如果驱动程序接受了该URL(通过acceptsURL方法),它将使用提供的配置信息(info对象)来建立连接。连接建立后,应用程序就可以通过返回的Connection对象与数据库进行交互。
小结
经过上述步,获取连接后,通过JDBC接口访问calcite注册的数据源。Apache Calcite选择基于JDBC实现交互接口,具备下面两个好处:
- 普适性:JDBC(Java Database Connectivity)是Java应用程序与数据库通信的标准API,广泛用于Java开发中。选择JDBC使Calcite能够立即被Java开发者接受和使用,而不需要学习新的接口或编程模型。
- 兼容性:通过使用JDBC,Calcite可以与现有的工具和框架(如Java应用服务器、数据库客户端工具等)无缝集成,这些工具通常已经支持JDBC。
总结
在使用calcite时,根据合适的场景选择是否需要使用calcite jdbc驱动来,前文举例中「查询优化器」可以使用也可以直接通过Calcite的API来创建优化所需要的schema。而查询场景我们基于JDBC接口来完成,就需要前置通过Calcite驱动来获取连接对象。
相关文章:
Apache Calcite - calcite jdbc驱动使用场景
前言 在使用Calcite查询数据时通常会用到这些代码获取schema Connection connection DriverManager.getConnection("jdbc:calcite:", info); CalciteConnection calciteConnection connection.unwrap(CalciteConnection.class); SchemaPlus rootSchema calciteC…...
IEC61850实现方案和测试-4-MMS协议
IEC61850实现方案和测试-4作为介绍实现方案和测试的第四篇文章,后续会继续更新,欢迎关注。前三篇如下 第一篇是:IEC61850实现方案和测试-1-CSDN博客 第二篇是:IEC61850实现方案和测试-2-UCA-CSDN博客 第三篇是:IEC6…...
【ubuntu24.04】GTX4700 配置安装cuda
筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda...
时间的礼物:如何珍视每一刻
《时间的礼物:如何珍视每一刻》 夫时间者,宇宙之精髓,生命之经纬,悄无声息而流转不息,如织锦之细线,串联古今,贯穿万物。 人生短暂,犹如白驹过隙,倏忽而逝,…...
componentReceivePropsreact class生命周期
componentReceiveProps并不是有props的变化触发,而是由父组件的更新触发的 父组件导致组件重新渲染,即使props没有更改,也会调用componentReceiveProps这个方法;如果只想处理更改,确保当前值与变更值比较--官方 …...
快速理解微服务中Sentinel怎么实现限流
Sentinel是通过动态管理限流规则,根据定义的规则对请求进行限流控制。 一.实现步骤 1.定义资源:在Sentinel中,资源可以是URL、方法等,用于标识需要进行限流的请求;(在Sentinel中,需要我们去告诉Sentinel哪些…...
25.100ASK_T113-PRO 测试摄像头(型号)
1.摄像头 USB2.0 摄像头,支持 UVC协议, 就是V4L2 USB2.0 大概可这样理解吧.这个是2K分辨率. 2.8mm焦距. 开发板还是 100ASK_T113-PRO V1.2版 2.查看摄像头驱动挂载情况 这样接好. 看看设备有没有挂载上 # ls /dev/video* /dev/video0 /dev/video1 这两个就是USB摄像头.说…...
20241127 给typecho文章编辑附件 添加视频 图片预览
Typecho在写文章时,如果一次性上传太多张图片可能分不清哪张,因为附件没有略缩图,无法实时阅览图片,给文章插入图片时很不方便。 编辑admin/file-upload.php 大约十八行的位置 一个while 循环里面,这是在进行html元素更新操作,在合…...
StarRocks-join优化
1、背景 有两个大表,都是6kw级别上下的,通过SR然后包装了一个接口对外提供查询,当前的问题是,这样大的join查询会导致BE直接宕机。并且这个sql很有代表性,我截图如下: 这个表是个单分区,所以直接…...
如何通过ChatGPT提高自己的编程水平
在编程学习的过程中,开发者往往会遇到各种各样的技术难题和学习瓶颈。传统的学习方法依赖书籍、教程、视频等,但随着技术的不断发展,AI助手的崛起为编程学习带来了全新的机遇。ChatGPT,作为一种强大的自然语言处理工具,…...
实时数据开发 | checkpoints监控和调优
监控Checkpoints 监控 checkpoint 行为最简单的方法是通过 UI 的 checkpoint 部分。 监控这两个指标: 算子收到第一个 checkpoint barrier 的时间。当触发 checkpoint 的耗费时间一直很高时,这意味着 checkpoint barrier 需要很长时间才能从 source 到达 operator…...
面试手撕题积累
1、实现滑动窗口限流,允许每分钟最多有100个请求 阿里一面题。 核心: 时间窗口管理:滑动窗口会根据时间流逝不断更新,需要记录请求的时间戳,并根据当前时间计算窗口内的请求数量。 限流判断:每次请求到来…...
开发中使用UML的流程_05 PIM-1:分析系统流程
目录 1、概述 2、PIM生成的过程 3、用例叙述格式 4、用例关系 5、执行流程: 6、惯用的编号方式 1、概述 在进入到PIM阶段之后,系统分析员将所有系统用例依相关性分成若干组,以组别方式生成该组系统用例涉及的PIM-1---PIM-4产生结果&am…...
【Go】-go中的锁机制
目录 一、锁的基础知识 1. 互斥量/互斥锁 2. CAS(compare and swap) 3. 自旋锁 4. 读写锁 5. 乐观锁 & 悲观锁 6. 死锁 二、go中锁机制 1. Mutex-互斥锁 2. RWMutex-读写锁 2.1 RWMutex流程概览 2.2 写锁饥饿问题 2.3. golang的读写锁源…...
Scala学习记录,全文单词统计
package test32 import java.io.PrintWriter import scala.io.Source //知识点 // 字符串.split("分隔符":把字符串用指定的分隔符,拆分成多个部分,保存在数组中) object test {def main(args: Array[String]): Unit {//从文件1.t…...
重构项目架构
前言 我们上篇文章对整个项目进行一个整体的规划,其中对于APP类规划了类,本篇文章我们就来实现这个规划; class App {//加载页面constructor() {}//获取位置_getPosition() {}//接受位置_loadMap() {}//在地图上点击展现表单_showForm() {}/…...
一个开源轻量级的服务器资源监控平台,支持告警推送
大家好,今天给大家分享一款开源的轻量级服务器资源监控工具Beszel,提供历史数据记录、Docker容器统计信息监控以及多种警报功能,用于监控服务器资源。 项目介绍 Beszel由hub(中心服务器端应用,基于PocketBase构建&…...
介绍一下atof(arr);(c基础)
hi , I am 36 适合对象c语言初学者 atof(arr);是返回浮点数(double型),浮点数数是arr数组中字符中数字 格式 #include<stdio.h> atof(arr); 返回值arr数组中的数 未改变arr数组 #include<stdio.h> //atof(arr) 返 <stdlib> int…...
基于微信小程序的平价药房管理系统+LW参考示例
1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…...
什么是 C++ 中的函数对象?它有什么特点?如何定义和使用函数对象?数对象与普通函数有什么区别?
在 C 中,函数对象(Function Object)也被称为仿函数(Functor),是一种可以像函数一样被调用的对象,是一个类的对象,该类重载了函数调用运算符operator()。 函数对象的特点: 与普通函数…...
JAVA篇05 —— 内部类(Local、Anonymous、Member、Static)
欢迎来到我的主页:【一只认真写代码的程序猿】 本篇文章收录于专栏【小小爪哇】 如果这篇文章对你有帮助,希望点赞收藏加关注啦~ 目录 1 内部类Inner Class 1.1 局部内部类 1.2 匿名内部类(※※) 1.3 匿名类最佳实践…...
vmware安装ubuntu22.04 复制黏贴 上网
1、ubuntu下载 [Download - 清华镜像站]: 点击 清华大学开源软件镜像站 - Ubuntu 22.04.4 下载 页面中的 ubuntu-22.04.4-desktop-amd64.iso清华大学开源软件镜像站 - Ubuntu 22.04.4 下载 2、安装向导 3、网络设置 sudo netplan try sudo netplan apply4、复制…...
Spring Bean初始化流程
首先: 加载Bean定义(Configuration) 然后对于每个Bean: 1、实例化Bean(应该是从Bean方法中获取,Bean方法里面包含new这个类型的代码)2、依赖注入(所依赖的Bean要经历相同的流程)、调用Setter…...
C 语言函数递归探秘:从基础概念到复杂问题求解的进阶之路
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 目录 什么是函数递归递归的基本组成递归的工作原理递归的优缺点递归的经典案例 5.1 阶乘计算5.2 斐波那契数列5.3 汉诺塔问题5.4 二分查找 递归的高级…...
【Zookeeper】三,Zookeeper的安装与基本操作
文章目录 安装Zookeeper下载解压解压后的目录结构运行Zookeeper 基本操作 安装Zookeeper 下载 官网下载Zookeeper,会得到一个tar包,如:apache-zookeeper-3.8.4-bin.tar.gz 解压 tar -xvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/loca…...
STL算法之数值算法<stl_numeric.h>
这一节介绍的算法,统称为数值(numeric)算法。STL规定,欲使用它们,客户端必须包含头文件<numeric>.SGI将它们实现与<stl_numeric.h>文件中。 目录 运用实例 accumulate adjacent_difference inner_product partial_sum pow…...
Git 入门超简单指南
1. 什么是 Git? Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年创建。它的主要目的是帮助开发者有效地管理和跟踪项目的历史版本。通过使用 Git,你可以轻松地记录每一次代码的修改,回滚到以前的版本,以及…...
UE5 和 UE4 中常用的控制台命令总结
调用控制台 按下键盘上的 ~ 键可以调用控制台命令。 技巧 使用键盘的 ↑ 键可以查看之前输入过的指令。控制台指令并不需要打全名,输入空格后跟随指令的部分字符可以进行模糊搜索。按下 Ctrl Shift , 打开 GPUProfile 面板。 命令如下: 调试类 s…...
[护网杯 2018]easy_tornado
这里有一个hint点进去看看,他说md5(cookie_secretmd5(filename)),所以我们需要获得cookie_secret的value 根据题目tornado,它可能是tornado的SSTI 这里吧filehash改为NULL. 是tornado的SSTI 输入{{handler.settings}} (settings 属性是一个字典&am…...
论 ONLYOFFICE:开源办公套件的深度探索
公主请阅 引言第一部分:ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分:ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分:技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分:部…...
华为OD机试真题---幼儿园篮球游戏
华为OD机试真题中的“幼儿园篮球游戏”是一道有趣的逻辑模拟题。以下是该题目的详细描述及解题思路: 题目描述 幼儿园里有一个放倒的圆桶,它是一个线性结构。允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。每个篮球有单独的编…...
C#基础控制台程序
11.有一个54的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 12.从键盘输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 13.输入一个数,判断它是奇数还是偶数,如果…...
CASS插入多行文字
问题描述 有时在DWG文件中需要标注多行文字,文字注记只是单行的。 解决办法 工具栏中选择文字——>写文字。快捷键是 MTEXT 可以自行换行,并设置相关格式。 当需要把多行文字转换成单行文字的时候,使用下列功能。可以将多行文字变成…...
【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍
概 述 : D1671是 一 块 带 4级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 , 可 在3V或5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV影 象 输 出 功 能 的 产 品 上 面,比如 机 顶 盒 ,监 控 摄 象 头 ,DVD&#…...
基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()
目录 前言 问题分析 page buffers创建 page buffers丢失 Write-Protect Dirty Page w/o Buffers 问题解决 前言 这个问题发生在3.10.0-514.el7上,并且在RHEL的知识库中快速找到了对应的案例以及解决方案,但是,理解问题如何发生和解决…...
理解Java集合的基本用法—Collection:List、Set 和 Queue,Map
本博文部分参考 博客 ,强烈推荐这篇博客,写得超级全面!!! 图片来源 Java 集合框架 主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合(单列…...
SQL for XML
关系数据模型与SQL SQL for XML 模式名功能RAW返回的行作为元素,列值作为元素的属性AUTO返回表名对应节点名称的元素,每列的属性作为元素的属性输出输出,可形成简单嵌套结构EXPLICIT通过SELECT语法定义输出XML结构PATH列名或列别名作为XPAT…...
RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)
??博客主页:【_-CSDN博客】** 感谢大家点赞??收藏评论** 文章目录 ???1.0 RabbitMQ 的可靠性 ? ? ? ? 2.0 发送者的可靠性 ? ? ? ? 2.1 生产者重试机制 ? ? ? ? 2.2 生产者确认机制 ? ? ? ? 2.2.1 开启生产者确认机制 ? ? ? ? 2.2…...
Java设计模式 —— 【创建型模式】原型模式(浅拷贝、深拷贝)详解
文章目录 前言原型模式一、浅拷贝1、案例2、引用数据类型 二、深拷贝1、重写clone()方法2、序列化 总结 前言 先看一下传统的对象克隆方式: 原型类: public class Student {private String name;public Student(String name) {this.name name;}publi…...
LightRAG - 更快更便宜的GraphRAG
检索增强生成(Retrieval-Augmented Generation, RAG)已经成为提升大型语言模型(LLMs)能力的重要方法之一,通过整合外部知识,显著改善了生成内容的质量和相关性。 RAG 的局限性 传统的 RAG 系统虽然表现优…...
基于STM32的智能风扇控制系统
基于STM32的智能风扇控制系统 持续更新,欢迎关注!!! ** 基于STM32的智能风扇控制系统 ** 近几年,我国电风扇市场发展迅速,产品产出持续扩张,国家产业政策鼓励电风扇产业向高技术产品方向发展,国内企业新增投资项目投…...
Java面试问答FAQ
目录: 1、post为什么会发送两次请求?2、单核CPU支持多线程吗?3、ConcurrentHashMap 如何保证线程的安全性? 1、post为什么会发送两次请求? A:那是因为浏览器的安全策略(同源策略)决…...
PHP中类名加双冒号的作用
在 PHP 中,类名加双冒号(::) 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词(如 parent、self 和 static)。以下是详细的解释和用法。 1. 用途概述 :: 被称为作用域…...
[极客大挑战 2019]PHP
访问www.zip拿到源码. 绕过这三处. 构造exp <?php class Name{private $username admin;private $password 100;}$select new Name();$resserialize($select); echo $res ?>O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin"…...
【versal】【petalinux】添加LED驱动
versal 添加LED驱动 ` 提示:本文使用外部kernel与uboot`一、LED1.1 LED功能1.2 LED节点1.3 LED操作命令1.3.1 点LED1.3.2 关闭LED二、LED驱动2.1 驱动文件2.2 设备树兼容属性三、 LED设备树配置3.1 设备树配置信息3.2 设备树配置信息讲解四、提示4.1 正确4.2 错误4.3提示:本文…...
【前端】JavaScript中的字面量概念与应用详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯字面量1. 数字字面量2. 字符串字面量3. 布尔字面量4. 空值字面量(null)5. 对象字面量6. 数组字面量7. 正则表达式字面量8. 特殊值字面量9. 函数字…...
工作学习:切换git账号
概括 最近工作用的git账号下发下来了,需要切换一下使用的账号。因为是第一次弄,不熟悉,现在记录一下。 打开设置 路径–git—git remotes,我这里选择项是Manage Remotes,点进去就可以了。 之后会出现一个输入框&am…...
python-解决一元一次方程
【题目】解决一元一次方程数学问题 【问题描述】 我们要解决一个较为复杂的一元一次方程数学问题,方程形如:ax b c,其中a、b、c为已知常数,x为未知数。 现在我们要通过编程的方式解决这个问题,即找到方程的解x。 【…...
在线音乐播放器 —— 测试报告
自动化脚本源代码:Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 (1)后端开发 (2)前端开发 (3)数据库 二、项目功能…...