自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(163)
  • 收藏
  • 关注

原创 MyBatis 拦截器链执行顺序及原理深度解析:揭开动态代理背后的奥秘

MyBatis 拦截器链(Interceptor Chain)是 MyBatis 提供的一种扩展机制,允许开发者在 SQL 执行的关键环节​(如执行查询、更新操作)插入自定义逻辑。它类似于给 SQL 执行流程安装的“可编程插件”,能够在不修改框架源码的情况下,实现日志记录、数据加密、分页处理等高级功能。MyBatis 拦截器链通过动态代理和责任链模式的巧妙结合,实现了高度灵活的功能扩展。优势说明非侵入式扩展无需修改框架源码灵活的执行顺序控制通过配置顺序控制代理层级细粒度的拦截范围。

2025-03-05 19:18:52 397

原创 MySQL 8 C++ 源码解析:EXPLAIN 实现机制

MySQL 的EXPLAIN实现通过多层模块协作完成,从命令解析到优化器决策,最终生成用户可读的执行计划。其源码设计兼顾灵活性与性能,支持多种输出格式和复杂查询场景。理解这一机制,有助于深入掌握 MySQL 的查询优化逻辑,并为性能调优提供底层支持。

2025-03-03 17:41:18 684

原创 深入解析ClientPreparedStatement:Java端与MySQL8源码的协作

在数据库开发中,预处理语句()是防止SQL注入、提升性能的利器。然而,并非所有场景都适合使用服务器端预处理。当配置时,JDBC驱动会退化为,直接将参数拼接到SQL中执行。本文将从和双重视角,解析这一机制的工作原理、性能影响及适用场景。

2025-03-02 07:07:54 688

原创 从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制

通过深入Java与MySQL源码,我们揭示了从参数绑定到执行的全链路过程。这种底层视角不仅帮助开发者优化数据库操作,还能更好地应对高并发场景下的性能挑战。正确使用预处理语句,是编写高效、安全数据库应用的关键一步。##java调用栈##java堆栈##mysql8源码 mysqld_stmt_prepare方法gdb堆栈(gdb) bt##mysql8源码 mysqld_stmt_execute 方法gdb堆栈)"(gdb) bt。

2025-03-01 18:00:10 1114

原创 深入解析 MySQL 中的时间函数:NOW() 与 SYSDATE() 的奥秘

尝试在事务中混用。

2025-03-01 08:19:30 1110

原创 Spring AOP切面失效问题解析:Controller内部方法调用如何拦截?

随着Spring 6/Spring Boot 3对AOT(Ahead-Of-Time)编译的支持,未来可能出现更优雅的解决方案。但在当前技术体系下,合理选择本文提供的方案,即可有效应对Controller内部方法调用的切面拦截难题。,将业务逻辑合理拆分到Service层,既能规避代理限制,又能提升代码可维护性。对于遗留系统,AspectJ方案提供了更强大的拦截能力,但需要权衡字节码增强带来的复杂性。本文将深入剖析这一问题的根源,并提供多种实用解决方案,帮助开发者绕过这一“代理陷阱”。

2025-02-26 16:08:47 573

原创 深入理解 MySQL 8 C++ 源码:SELECT MOD(MONTH(NOW()), 2) 的函数执行过程

NOW()函数的实现声明文件(或其派生类实现文件核心方法负责获取当前时间。通过分析内置函数的实现:通过类封装逻辑。表达式求值:递归调用val_int()或方法。源码结构:时间函数在,数学函数在。掌握这些底层细节,不仅能帮助开发者调试复杂 SQL,还能为贡献 MySQL 源码或定制内置函数奠定基础。##MOD函数##MONTH函数。

2025-02-20 22:59:54 1121

原创 深入解析 MySQL 8 C++ 源码:二级索引回表操作

在 InnoDB 中,表的数据是按照聚簇索引(主键索引)组织的,这意味着每行数据都存储在聚簇索引的叶子节点中。而二级索引则只包含索引列和对应的主键值。当查询涉及二级索引时,InnoDB 可以通过二级索引快速定位到主键值,但为了获取完整的行数据,还需要通过主键值回表到聚簇索引中。例如,假设有一个表t,主键为id,并有一个二级索引idx_namesql复制age INT,当执行以下查询时:sql复制InnoDB 首先会通过二级索引idx_name查找到满足条件的记录,获取其主键值id。

2025-02-19 14:15:56 921

原创 java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

在开发和生产环境中,出于安全和隐私的考虑,我们可能不希望将详细的错误信息暴露给用户。Tomcat 提供了一种机制,允许我们通过配置来控制错误报告的显示。本文将详细介绍如何在 Tomcat 的server.xml文件中配置,以屏蔽错误报告和服务器信息。

2025-02-14 18:45:21 839

原创 mysql8 从C++源码角度看sql生成抽象语法树

词法分析:在my_sql_parser_parse内部,首先会使用MYSQL_LEX对象对输入的SQL字符串进行词法分析,将SQL文本分割成一系列标记(tokens)。MySQL 8的C++源码中,SQL语句的词法分析和语法分析是通过一个复杂的解析器实现的,这个解析器将输入的SQL文本转换成抽象语法树(AST)。具体的词法分析是由MYSQL_LEX类完成的,而语法分析则是由Bison生成的解析器根据.y文件(例如sql_yacc.yy)中的规则来处理的。AST是一种树形结构,用于表示源代码的逻辑结构。

2025-02-08 18:50:02 1180

原创 mysql8 用C++源码角度看客户端发起sql网络请求,并处理sql命令

MySQL 8 的 C++ 源码中,处理网络请求和 SQL 命令的流程涉及多个函数和类。

2025-02-08 15:50:30 541

原创 mysql8 sql语法错误,错误信息是怎么通过网络发送给客户端的,C++源码展示

【代码】mysql8 sql语法错误,错误信息是怎么通过网络发送给客户端的,C++源码展示。

2025-02-07 18:46:15 247

原创 mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制

MAX_FIELDS的定义通常在 MySQL 的头文件中,例如或其他相关头文件。在 MySQL 8 中,MAX_FIELDS的值为4096。最大字段数量:MySQL 8 中表的最大字段数量为4096。代码中的体现:在函数中通过MAX_FIELDS宏检查表的字段数量。MySQL 中,每行记录的最大长度限制为65,535 字节。这个限制是由 MySQL 的内部实现决定的,而不是由某个特定的源码文件或函数直接定义的。这个限制适用于所有存储引擎,包括 InnoDB 和 MyISAM。

2025-02-07 18:36:23 403

原创 mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制

MAX_FIELDS的定义通常在 MySQL 的头文件中,例如或其他相关头文件。在 MySQL 8 中,MAX_FIELDS的值为4096。最大字段数量:MySQL 8 中表的最大字段数量为4096。代码中的体现:在函数中通过MAX_FIELDS宏检查表的字段数量。MySQL 中,每行记录的最大长度限制为65,535 字节。这个限制是由 MySQL 的内部实现决定的,而不是由某个特定的源码文件或函数直接定义的。这个限制适用于所有存储引擎,包括 InnoDB 和 MyISAM。

2025-02-07 18:33:24 465

原创 用JAVA 源码角度看 客户端请求服务器流程中地址是域名情况下解析域名流程

Java 客户端请求流程中解析域名的过程涉及多个层次的处理,从类的高层方法到底层的系统调用。通过缓存、代理选择和权限检查等机制,Java 能够灵活地处理各种网络环境下的域名解析和连接请求。这个过程确保了客户端能够高效、安全地与远程服务器进行通信。##实验代码try {// 创建URL对象// 打开连接// 设置请求方法为GET// 设置超时时间// 获取响应码// 如果响应成功,则读取响应内容。

2025-01-07 22:20:40 651

原创 修改openjdk17源码,手搓native方法调用java method方法(无参,无返回值)

修改openjdk17源码,jvm.cpp新增一个native方法,传入对象和要被调用的方法(无参,无返回值)void。

2025-01-04 10:17:27 904

原创 java class类对象 加载时机

总结来说,类的加载时机是在程序第一次主动使用类时触发的,而类的实例化是在代码中显式创建对象时发生的。类加载是一个自动的过程,由 Java 虚拟机控制,而实例化则是由程序员的代码控制的。在 Java 中,类对象的加载时机通常指的是类加载机制中的“加载”阶段,而实例化则是指创建类的实例对象的过程。java class类对象 是在什么时候被加载的?

2025-01-02 22:02:40 506

原创 mysql8 从C++源码角度看 客户端发送的sql信息 mysql服务端从网络读取到buff缓存中

这段代码主要负责从网络读取数据包,它包含了多个函数来处理网络数据的读取、缓冲区管理、包的解压缩、重试机制和超时处理等。函数: 该函数是 MySQL 网络协议栈的一个核心函数,用于从网络上读取一个数据包。它处理了数据包头的读取、压缩包的处理、包的重新分配和数据的实际读取。读取包头,获取包的长度。如果包是压缩的,则解压缩并更新complen(解压后的包长度)。检查是否需要扩展缓冲区来适应包的内容。最终调用读取实际的包数据。函数: 这个函数是读取原始数据的实际工作函数,它通过vio_read。

2024-12-31 22:43:35 1331

原创 mysql8 从C++源码角度看 Statement cancelled due to timeout or client request异常

这个类的主要目的是在查询超时时提供一个机制来取消正在执行的 SQL 查询。这是 JDBC 驱动程序中的一个高级特性,允许应用程序在查询执行时间过长时中断查询,以避免资源长时间占用。这种机制对于需要处理大量数据或执行复杂查询的应用程序尤其重要,因为它可以帮助提高应用程序的响应性和资源利用率。这个类是 JDBC 驱动程序的一部分,用于处理查询超时的情况。这个方法是线程间通信的一种方式,用于安全地中断另一个线程的执行。命令的核心部分,允许管理员或有权限的用户终止长时间运行的查询或释放资源。)还是关闭整个连接(

2024-12-31 21:41:36 432

原创 Druid连接池管理连接池中的空闲连接驱逐流程

通过以上步骤,Druid连接池能够有效地管理空闲连接,确保连接池的健康和高效运行。

2024-12-28 22:38:03 362

原创 mysql8 Too many connections 失败原因从mysql8 C++源码角度分析

在。

2024-12-28 12:32:51 564

原创 java native isInstance方法在c++源码中对应的方法,是怎么比对,对象是不是这个class的

Java 的。

2024-12-26 09:36:57 249

原创 openjdk17 中 klass 数组 在元空间内存分配

【代码】klass 数组 内存空间分配。

2024-12-25 19:06:29 155

原创 openjdk17 从C++源码视角看 ArrayList对象在内存中占用24个字节

代码展示了如何从线程本地分配缓冲区中分配内存。在这个例子中,请求分配的大小为 3 个HeapWord,即 24 字节。这种分配方式是为了减少分配时的锁争用,提高内存分配效率。这段代码是在 TLAB 上分配了 24 字节的内存。这种分配是在 Java 堆上进行的,而不是在栈上。TLAB 是 Java 堆的一部分,用于提高对象分配的效率。##C++源码if (result!return obj;

2024-12-22 16:28:07 333

原创 openjdk17 从C++ 源码角度看 对象数组内存分配的字节数

#gdb调试栈 130002*8=1040016字节。可以看出对象数组占用内存字节1040016字节。##java jol 工具类看内存布局。

2024-12-22 09:44:21 243

原创 openjdk17 从C++视角 看字节码ldc指令字符串加载过程

字符串常量会被新增到字符串池中(intern),前提是常量池中尚未包含该字符串。如果字符串已存在,则不会新增,而是直接返回已有的字符串对象。##C++源码##break;break;#endifif (!break;if (!if (fail!

2024-12-22 08:04:40 280

原创 javac 编译java文件源码 怎么生成 ast语法树 步骤详解

javac编译源代码的过程首先将源文件加载到中。使用Parser将这些源文件解析为,这是 AST 的根节点。包含文件中的所有类、方法、字段和其他结构。解析后的 AST 可以用于进一步的代码分析、优化或生成字节码。javac的 AST 是通过一系列的解析器和内部数据结构实现的,主要依赖JCTree类的层次结构来表示源代码的各种构造。

2024-12-20 18:16:33 605

原创 修改openjdk17 java/lang/String.java 类源码,增加一个native本地方法打印固定字符串功能

#/home/yym/openjdk17/jdk17-master/build/linux-x86_64-server-slowdebug/support/headers/java.base/java_lang_String.h增加方法。##/home/yym/openjdk17/jdk17-master/src/hotspot/share/include/jvm.h文件增加方法。##src/java.base/share/native/libjava/String.c增加方法。

2024-12-19 21:27:57 334

原创 openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接

通过在。

2024-12-19 19:09:54 536

原创 C++中,左值、右值、左值引用、右值引用 区别

特性左值 (Lvalue)右值 (Rvalue)左值引用 (Lvalue Reference)T&右值引用 (Rvalue Reference)T&&定义表示一个有持久地址的对象表示临时的、没有持久地址的对象引用一个左值对象引用一个右值对象示例int x = 10;10或x + 5等是否有地址有没有(通常是临时的)是(引用左值的地址)是(引用右值的地址)是否可以修改可以修改通常不可修改(临时值)可以通过引用修改原对象通常不能修改(右值引用的对象是临时的)是否可以取地址可以。

2024-12-17 22:02:59 922

原创 C++ 中,标准库容器emplace 和 移动构造函数区别

emplace用于在容器内部就地构造对象,避免了不必要的对象拷贝或移动,通常可以提高性能。移动构造函数是一种优化技术,避免了在右值传递时的资源拷贝,特别适用于需要管理动态资源的类。这两者虽然都与效率和构造相关,但它们的应用场景和实现方式不同,emplace侧重于容器内部对象的高效创建,而移动构造函数侧重于通过转移资源提高对象传递效率。

2024-12-17 21:49:58 767

原创 C++ 中,构造函数、拷贝构造函数和移动构造函数区别

特性构造函数拷贝构造函数移动构造函数调用时机创建一个新的对象时调用通过已有对象复制初始化一个新对象时调用通过临时对象或右值初始化新对象时调用参数类型没有参数或有参数同类型对象的常量引用 (const &右值引用 (资源管理初始化对象,分配资源(如有)复制对象的资源资源的“转移”,避免复制性能影响性能取决于构造逻辑会进行资源的复制,可能较慢高效,避免了不必要的复制操作编译器自动生成编译器自动生成默认构造函数编译器自动生成默认拷贝构造函数编译器不会自动生成(除非特定情况)

2024-12-17 18:59:33 925

原创 C++ 模版函数 函数模版 区别

函数模板是一种机制,它允许你定义一个函数,函数体可以使用类型参数。模板函数通常就是通过模板机制定义的函数,是函数模板的实例化。简而言之,函数模板和模板函数通常指代同一概念,在日常使用中,大家没有严格的区分,都会称其为“函数模板”。

2024-12-17 18:50:03 251

原创 C++ 模版函数 在编译的时候就已经确定函数类型

因此,模板函数的类型是在编译时确定的,而不是在运行时。这意味着模板函数提供了类型安全,因为所有的类型检查都是在编译时进行的。如果类型不匹配,编译器会报错,而不是在运行时抛出异常。模板函数和模板类是 C++ 中实现泛型编程的一种机制,它们允许程序员编写与类型无关的代码。),在编译时生成具体的函数实例(称为模板实例化)。这些实例是普通的函数,它们与普通的函数在运行时没有区别。总结来说,模板函数通过编译时的类型推断和实例化,实现了类型无关的代码编写,提高了代码的重用性和灵活性。,都可以生成一个相应的函数实例。

2024-12-17 18:46:51 179

原创 C++ 模版中 inline.hpp 和 hpp文件区别

hpp文件通常包含模板的声明和可能的定义。文件包含模板的定义,特别是那些较长的定义,以提高编译效率和代码组织。使用文件是一种常见的实践,用于优化模板的编译和包含过程。

2024-12-17 18:44:25 329

原创 C++ 中 指针常量 常量指针 区别

指针常量):指针不可改变,但指向的数据可以改变。常量指针):数据不可改变,但指针可以改变。

2024-12-16 18:01:30 344

原创 C++ 中 引用与指针 区别 左值 右值区别

引用一旦绑定到一个对象,就无法更改引用的对象;而指针可以在不同的时间指向不同的对象。引用通常用于函数参数传递,指针可以用于动态内存管理。左值(Lvalue):有地址,可以修改,表示一个对象(例如变量、数组元素)。右值(Rvalue):没有地址,通常是一个临时对象,表示计算结果或者常量(例如a + b,常量值10。

2024-12-16 13:36:55 313

原创 spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接

#关闭事件监听ShutdownListener.shutdownCompleted中 this.shutdownCause已经有值,所以不等空,打开连接为假。##findOpenChannel从channelList缓存数组中清理掉channel.isOpen()是关闭的。##使用CachingConnectionFactory缓存里面的this.connection.target。##connection.isOpen()连接未打开,channel为空,新建一个channel。

2024-12-15 22:39:44 720

原创 openjdk17 从C++源码视角 intern方法看字符串常量池

#jvm在初始化的时候,调用create_table生成本地表。##在本地表没有找到,则创建一个新的插入到本地表。##String native方法。##字符串表查找字符串。

2024-12-14 21:52:34 244

原创 redis 使用Lettuce 当redis挂掉重启之后 网络是怎么重新连接

监控连接的生命周期,当连接丢失时触发重连。管理重连过程,通过延迟和重连尝试次数来合理安排重连。确保连接恢复,并在重连失败时通过事件总线通知其他组件。因此,只是连接建立时的一个简单事件,而是负责监控连接丢失后自动重连的核心组件。##看门狗源码/**//***//***/} else {});

2024-12-13 18:51:16 1464

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除