Java与groovy混编 —— 一种兼顾接口清晰和实现敏捷的开发方式

Groovy+Java混合使用例子 Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.youkuaiyun.com/rcom10002/archive/2011/06/26/6568557.aspx 立即下载

转载备注

最近闲来重新审视了一下groovy,突然萌发了一个新的想法,既然groovy完全兼容java的,其也是可以预编译的,那么是否可以直接用groovy来代替java来完成日常的工作呢?碰巧找到了这篇2015年的博文,甚幸。

原文链接:http://pfmiles.github.io/blog/java-groovy-mixed/

以下正文:

  1. 有大量平均水平左右的“工人”可被选择、参与进来 —— 这意味着好招人
  2. 有成熟的、大量的程序库可供选择 —— 这意味着大多数项目都是既有程序库的拼装,标准化程度高而定制化场景少
  3. 开发工具、测试工具、问题排查工具完善,成熟 —— 基本上没有团队愿意在时间紧、任务重的项目情况下去做没有把握的、基础开发工具类的技术试探
  4. 有面向对象特性, 适合大型项目开发 —— 无数大型项目已向世人述说,“面向对象”是开发大型软件的优秀代码组织结构
  5. 能适应大型团队、多人协作开发 —— 代码需要简单易懂,起码在接口、api层面是这样

—— 这是我所理解的“工业化开发编程语言”的概念

很显然, java就是种典型的“工业语言”, 非常流行,很多企业靠它赚钱,很实际;但java也是常年被人黑,光是对其开发效率的诟病就已经足够多,不过java始终屹立不倒;这样的局面其实无所谓高兴还是担忧,理性的程序员有很多种,其中一种是向“钱”看的 —— 我写java代码,就是因为工作需要而已,能帮助我的组织搞定业务,做出项目,这很好;当有人说java语言不好的时候,理性的程序员不会陷入宗教式的语言战争之中,他会思考这些人说的是否有道理;如果真的发现整个java平台大势已去,他会毫不犹豫地扭头就走,不过直到目前为止,还没有这种迹象出现;那么,从这些无数次的口水之争中,我们能否从别人的“战场”上发现一些有用的东西, 来改进我们的开发方式,从而使得java这种已经成为一个“平台”的东西走得更远,赚更多的钱呢?答案是“有的”,感谢那些参与口水战争的、各种阵营的年轻程序员们,有了你们,java speaker们才有了更多的思考;

我就只谈一个最实际的问题:

java被吐槽的这些年, 就开发效率这一点而言,到底有哪些东西是值得借鉴的?

也就是说,到底是哪些主要特性直接导致了某些其它语言在语法上相对于java的优越感?

丰富的literal定义

在groovy中定义map和list的惯用方式:

def list = [a, 2 ,3]
def map = [a:0, b:1]

而java呢?只能先new一个list或map,再一个个add或put进去; 上面这种literal(字面量)形式的写法便捷得多;

而javascript在这方面做得更绝, 我们都用过json,而json其实就是literal形式的object

极端情况下,一门编程语言里的所有数据类型,包括”内建”的和用户自定义的,统统可以写成literal形式;

在这种情形下,其实这种语言连额外的对象序列化、反序列化机制都不需要了 —— 数据的序列化形式就是代码本身, “代码”和“数据”在形式上被统一了

java对这方面几乎没有任何支持,对于提高编码效率来讲,这是值得学习的一点, 起码“内建”数据结构需要literal写法支持

first-class function & higher-order function & function literal(lambda)

无论是js, 还是python/ruby,或是groovy,都可以将函数作为另一个函数的参数传入,以便后者根据执行情况判断是否要调用前者

或者能够将一个函数作为另一个函数的返回值返回,以便后续再对其进行调用

这种高阶函数特性,就不要再说java的匿名内部类“能够”实现了, 如果认为匿名内部类已经”够用”了的话,其实就已经与现在的话题“开发效率”相悖了

高阶函数显然是一种值得借鉴的特性,它会让你少写很多很多无聊的“包装”代码;

还有就是匿名函数(lambda)了

我不喜欢lambda、lambda地称呼这个东西,我更喜欢把它叫做“匿名函数”或者“函数字面量(literal)”, 因为它跟数学上的lambda演算还是有本质区别,叫”lambda”有误导的危险

函数字面量的意思就是说,你可以在任何地方,甚至另一个函数体的调用实参或内部,随时随地地定义另一个新的函数

这种定义函数的形式,除了“这个函数我只想在这里用一次,所以没必要给它起个名字”这种理由之外,还有一个更重要的理由就是“闭包”了

所谓闭包,其实也是一个函数,但是在这个函数被定义时,其内部所出现的所有”自由变量(即未出现在该函数的参数列表中的变量)”已被当前外层上下文给确定下来了(lexical), 这时候,这个函数拥有的东西不仅仅是一套代码逻辑,还带有被确定下来的、包含那些“自由变量”的一个上下文, 这样这个函数就成为了一个闭包

那么闭包这种东西有什么好呢?其实如果懒散而钻牛角尖地想,闭包的所有能力,是严格地小于等于一个普通的java对象的,也就是说,凡是可以用一个闭包实现的功能,就一定可以通过传入一个对象来实现,但反过来却不行 —— 因为闭包只有一套函数逻辑,而对象可以有很多套,其次很多语言实现的闭包其内部上下文不可变但对象内部属性可变

既然这样,java还要闭包这种东西来干嘛?其实这就又陷入了”匿名内部类可以实现高阶函数”的困境里了 —— 如果我在需要一个闭包的时候,都可以通过定义一个接口再传入一个对象来实现的话,这根本就跟今天的话题“开发效率”背道而驰了

显然,java是需要闭包的

强大而复杂的静态类型系统

这和开发效率有关么?

编程语言不是越“动态”,开发效率越高么?还需要强大而复杂的静态类型系统么?

试想一下这种api定义:

def eat(foo) {
    ...
}

这里面你认识的东西可能只有’吃’了, 你知道foo是什么么?你知道它想吃什么么?吃完后要不要产出点什么东西? —— 你什么都不知道

这种api极易调用出错,这就好比我去买饭,问你想吃什么你说“随便”,但买回肯德基你却说你实际想吃的是麦当劳一样

可能你还会反驳说,不是还有文档么?你把文档写好点不就行了么? —— 不要逼我再提“匿名内部类”的例子,如果给每个函数写上复杂详尽的文档是个好办法,那就显然 —— again, 与“开发效率”背道而驰了

那么,静态类型系统,这里显然就该用上了

静态类型系统在多人协作开发、甚至团队、组织间协作开发是非常有意义的;

拥有静态类型系统的编程语言通常都有强大的、带语法提示功能的IDE,这很正常,因为静态类型语言的语法提示功能好做;

只要把别人的库拿过来,导入IDE,各种函数签名只需扫一眼 —— 很多情况下根本不需要仔细看文档 —— 就已经知道这个函数是干嘛用的了, 合作效率成倍提升;

而且,作为”api”,作为“模块边界”,作为与其它程序员合作的“门面”, 函数签名上能将参数和返回值类型“卡”得越紧越好 —— 这样别人不用猜你这个函数需要传入什么类型,甚至他在IDE里一“点”,这里就给自动填上了 :)

要做到“卡得紧”,光有静态类型系统还不够,这个系统还需强大, 试想一下这个例子:

/**
 * 我只吃香蕉和猪肉,请勿投食其它物品
 */
public void eat(List<Object> list) {
    for(Object o: list) {
        if(o instanceof Banana){
            ... // eating banana
        } else if(o instanceof Pork) {
            ... // eating pork
        } else {
            throw new RuntimeException("System err.");
        }
    }
}

这段纯java代码已经是“定义精确”的静态类型了

但如果没有上面那行注释,你很可能会被System err.无数次

而这行注释之所以是必需的,完全是因为我找不到一个比List更好的表达“香蕉或猪肉”的形式, 这种情形足以让人开始想念haskell的either monad

在“强大而复杂的类型系统”这一点上,jvm平台上令人瞩目的当属scala了,可惜java没有,这是值得借鉴的

不过这一点的“借鉴”还需java的compiler team发力,我等也只是说说(按照java保守的改进速度,估计HM类型系统是指望不上了)

动态类型系统,duck-typing

刚说完静态类型,现在又来说动态类型系统合适么?

然而这与节操无关,我想表达的是,只要是有助于“开发效率”的,都能够借鉴,这是一个理性的java speaker的基本素质

我们在开发项目的时候,大量的编码发生在“函数”或“方法”的内部 —— 这就好比你在屋子里、在家里宅着一样, 是不是应该少一些拘束,多一些直截了当?

在这种情形下,动态类型系统要不要太爽? ——

Void visitAssert(AssertTree node, Void arg1) {
    def ahooks = this.hooks[VisitAssertHook.class]
    ahooks.each {it.beforeVisitCondition(node, errMsgs, this.ctx, resolveRowAndCol, setError)}
    scan((Tree)node.getCondition(), arg1);
    ahooks.each {it.afterVisitConditionAndBeforeDetail(node, errMsgs, this.ctx, resolveRowAndCol, setError)}
    scan((Tree)node.getDetail(), arg1);
    ahooks.each {it.afterVisitDetail(node, errMsgs, this.ctx, resolveRowAndCol, setError)}
    return null;
}

你知道ahooks是什么类型么?你不知道但我(我是编码的人)知道

你知道ahooks身上有些什么方法可以调么?你同样不知道但我知道

你不知道没关系,只要我知道就行了,因为现在是我在写这段代码;

这段代码写完以后,我只会把Void visitAssert(AssertTree node, Void arg1)这个类型明确的方法签名提供给你调用,我并不会给你看函数体里面的那坨东西,因此你知不知道上面这些真的没关系

方法内部满是def, 不用书写繁复的List>>>这种反人类反社会标语, 每个对象我知道它们身上能“点”出些什么来,我只管“点”,跑起来之后invokedynamic会为我搞定一切

动态类型系统 —— 这就是方法内部实现应该有的样子

哪怕你的方法内部实现就是一坨shi,你也希望这坨shi能尽可能小只一点,这样看起来更清爽是吧?

不要说我太分裂,我要笑你看不穿 —— 静态类型和动态类型既然都有好处,那么他们能放在一起么?

能的,这里就需要点明这篇文章的政治目的了: “java与groovy混编”

而且,目前来看,jvm平台上,只有它二者的结合,才能完成动态静态混编的任务

曾经我发出过这样一段感叹:

公共api、对外接口声明、应用程序边界…这些对外的“脸面”部分代码,如果拥有scala般强大的类型系统…就好了;而私有代码、内部实现、各种内部算法、逻辑,如果拥有groovy般的动态、简单的类型系统…就好了;综上,如果有门语言,在接口和实现层面分别持有上述特性,就好了

这种“理想”中的语言或许某天我有空了会考虑实现一个

而现在,虽说不是scala,但我终于想要在java和groovy身上来试验一把这种开发方式了

这里我坦白一下为什么没用scala,原因很简单,我在技术选型方面是势利的,scala还不被大多数平均水平的java开发人员(参见”工业化开发编程语言”定义第一条)接受,这直接导致项目的推进会遇到困难

而相对来讲,我暂且相信大多数java开发人员都还算愿意跨出groovy这一小步,当然这还需要时间证明

好了,下面还剩下一点点无关痛痒的牢骚 ——

元编程能力

macro, eval, 编译过程切入, 甚至method missing机制,这些都算“元编程”

元编程能力的强弱直接决定了使用这种语言创作“内部DSL”的能力

java在元编程方面的能力,几乎为0

这是值得借鉴的

与groovy的混编,顺便也能把groovy的元编程也带进来

各种奇巧的语法糖

语法糖,关起门来吃最美味,这也是一种使得“方法内部实现更敏捷”的附加手段

网上随便下载一份groovy的cheat sheet, 都会列举groovy的那些写代码方面的奇技淫巧

这些奇技淫巧,在各种脚本语言之间其实都大同小异, 因为他们本来就是抄来抄去的

结合方法内部的动态类型环境,这一定会进一步缩小方法内部实现代码的体积

java & groovy混编:一种最“势利”的折衷

我不去讨论什么语言才是The True Heir of Java, 那会使这篇文章变成一封战书,我只关心如何更好地利用现有开发资源完成项目,高效地帮组织实现利益

所以说java和groovy的混编是一种最“势利”的折衷,我不想强迫平均水平的开发人员去学习一种完全不同的语言,短期内不会对项目有任何好处,真正想去学的人他自己会找时间去学

而groovy,说它是java++也不为过,因为java代码直接就可以被groovy编译, groovy完全兼容java语法, 对一般java开发人员来说,这真是太亲切了

这里我要提一下我对“java和groovy混编”的一个个人性质的小尝试 —— kan-java项目

kan-java这个小工具,凡是用户在编码使用过程中能“碰”到的类和接口,全部都由java定义, 这确保用户拿到的东西都有精确的类型定义

凡是对上述接口的实现,都以groovy代码的形式存在

这贯彻了”接口静态类型,内部实现动态类型”的宗旨, 或者说“凡是要提供给另外一个人看、调用的地方(接口或接口类),使用java,否则就用groovy”

当然了,单元测试也完全由groovy代码实现

将kan-java的jar包引入到项目中使用时,就跟使用其它任何纯java实现的jar包一样 —— 接口清晰,参数类型明确,返回类型明确, 你不会也没有必要知道开发人员在具体实现的时候,使用动态语言爽过一把

对于java和groovy的混编,项目的pom.xml如何配置,除了可以参考kan-java的配置外,还可以参考这个gist: https://gist.github.com/pfmiles/2f2ab77f06d48384f113, 里面举例了两种配置方式,各有特色

具体的效果,还需要真正地去实际项目中体会

另外,kan-java也是一个有趣的工具,这个工具所实现的功能我也是从未见到java世界内有其它地方讨论过的,它可以辅助java做“内部DSL”,有场景的可以一试

快衰落、慢衰落,平坦衰落、频率选择性衰落 目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: . 阅读详情

相关推荐

AI自动打游戏全攻略:从环境搭建到Agent训练实战

本文系统介绍了AI自动打游戏的技术实现方案,重点解析了强化学习(DQN算法)在贪吃蛇游戏中的应用。文章从技术选型入手,对比了强化学习与计算机视觉两种方案,详细说明了开发环境配置步骤,并深入讲解了DQN模型构建、游戏环境封装、训练优化等核心环节。通过经验回放和目标网络等技术,有效提升了AI的学习效率和稳定性。该方案具有通用性,只需调整参数即可应用于其他简单游戏场景,为开发者实现游戏AI提供了完整的技术路径。

milk416666的博客 4145

Groovy系列三 Java SpringBoot 整合 Groovy

添加Groovy的依赖到Java项目中。 在Java代码中使用Groovy的类和脚本。Groovy代码可以直接在Java中执行,可以调用Groovy类的方法、访问其属性等。可以使用GroovyShell或GroovyClassLoader来执行Groovy脚本。

lly576403061的博客 8481

发那科机器人抓手与物料搬运阀的配置与优化实践

本文详细介绍了发那科机器人抓手与物料搬运阀的配置与优化实践,包括基础配置指南、阀岛与输入模块的详细设置、测试程序编写与验证技巧,以及常见问题排查与性能优化建议。通过实际案例和经验分享,帮助技术人员快速掌握关键配置步骤,提升物料搬运系统的稳定性和效率。

weixin_33738555的博客 386

Maven中java与Groovy的混合开发

Groovy 在后端也能尝到脚本语言的快感 Groovy Apache的Groovy是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用,Groovy代码动态地编译成运行于Java虚拟机(JVM)上的Java字节码,并与其他Java代码和库进行互操作。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也符合Groovy的语法规则,

weixin_57763462的博客 3458

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

半波整流是一种利用二极管的单向导通特性,将交流电转换为直流电的基础电路。它通过“切除”交流电的半个周期,仅保留另外半个周期来实现整流。1 开关电源超快学习思路点击跳转1.1开关电源的原理、结构和实物入门篇-超简单解读点击跳转1.2开关电源的EMI输入电路-超简单解读点击跳转倍压整流适用于需要高电压、小电流的特殊场合,通过电容充放电实现电压倍增。

2301_81299416的博客 2928

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

Java项目和Groovy的混用

Java项目和Groovy的混用

biubiubiubibibi的博客 902

LabVIEW工程密码保护机制与移除技术详解

LabVIEW作为工业自动化领域广泛使用的图形化编程工具,其密码保护机制涉及文件加密与权限控制等核心技术。从技术实现来看,现代版本采用AES-128加密结合SHA-256哈希校验,而经典版本使用XOR加密配合Base64编码。理解这些加密原理对于工程维护、灾难恢复等合法场景至关重要。在实际应用中,密码移除工具需要处理不同版本的文件结构差异,包括解析XML描述区的Protection标签、动态识别版本并应用对应解密策略。这类技术在工业设备维护、教学研究等场景具有重要价值,但必须注意遵守法律边界,确保拥有合法的

weixin_34161083的博客 392

Java一分钟之-Groovy与Java混合编程

Groovy与Java的混合编程为开发者提供了灵活性和生产力的双重提升,但同时也要求开发者对两种语言的特性有深入的理解,以避免潜在的陷阱。通过遵循最佳实践,明确代码规范,我们可以充分利用这两种语言的优势,构建既高效又易于维护的系统。实践证明,Groovy不仅能够作为Java项目的有益补充,还能在一定程度上促进Java代码的现代化和简洁化。

zevjay的博客 808

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2411

告别 GENERATE_SUBPOOL_DIR_FULL:用 RTTC 平替 CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE 的一套更稳方案

文章摘要:本文探讨了ABAP开发中动态内表的创建问题,重点分析了使用CL_ALV_TABLE_CREATE方法可能遇到的GENERATE_SUBPOOL_DIR_FULL错误。该错误源于临时subroutine pool的36次创建上限,常在批量处理或频繁调用时出现。文章提出基于RTTC技术的替代方案ZCL_ALV_TABLE_CREATE_RTTC,通过运行时类型服务直接创建动态内表,无需生成临时代码,从而规避了资源限制。该方法保持接口兼容性,只需简单替换类名即可实现无缝迁移,是解决动态表创建瓶颈的有效方

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

Groovy4的新特性概览

Groovy 4.0.0开始支持Switch Expression、Record Class、Sealed Class等Java语言特性。值得注意的是,即使Groovy 4.0.0运行在Java 8上,这些新特性依然可以使用。除了兼容Java语言特性外,Groovy自身也新增了不少实用的新特性,比如增强Range、支持TOML、Java化(@POJO)、GINQ(Groovy-Integrated Query)等。......

白石的专栏 2608

【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果(附项目源码)

本文介绍了Unity中实现传送门效果的完整流程。通过第一人称角色控制器实现移动,使用PortalView脚本和自定义Unlit Shader渲染门内场景,巧妙利用相机位置和旋转同步实现动态视角。重点解决了近裁剪面问题,确保远距离渲染正确性。最后通过PortalTeleporter脚本实现传送功能,检测碰撞并计算相对位置进行瞬移。该方法无需复杂插件,代码简洁高效,适用于各类3D场景中的传送门实现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

groovy java混编_java和groovy的混用

java在语言的动态性方便不是很灵活,如果你想快速增加或改变一些方法,那么只能通过反射机制,并且参数传递的格式很严格。相比之下,基于groovy可以快速写出一些自定义方法,并能和java很好结合,类似javascript在java中应用。环境:导入groovy-all-2.1.6.jarmaven:org.codehaus.groovygroovy-all2.1.6编写自定义的方法class Ja...

weixin_36424744的博客 941

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

基于JAVA+GROOVY敏捷开发(一)

因为之前在项目中使用了Groovy对业务能力进行一些扩展,效果比较好,所以简单记录分享一下,这里你可以了解:

qq_36988277的博客 1650

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java代码中使用Groovy的三种方式详解

java代码中使用Groovy的三种方式详解

qq_36305027的博客 1万+

JAVA项目中嵌入groovy脚本和java类混编使用

要想在其他类中像使用java类一样使用groovy脚本创建的类,需要满足如下条件: 1、groovy脚本中加入package com.test.groovy 2、脚本所在路径是 src/main/java 的编译路径下 groovy脚本中使用java类相对简单,类似于java类的使用引入即可使用。 ...

勇者无难 953

springboot集成java+groovy+lombok混合编程使用maven多模块打包实例

springboot多模块打包实例 由于在项目中引入了groovy编程,并且使用了lombok,在运行时没发现什么问题,但是最后打包部署时出现一系列问题。查了许久资料终于解决,特将解决方案写成文档记录一下 项目结构 upms-integrate 父模块 ├─upms-base 公共模块 │ ├─upms-web 管理后台-web │ ├─u...

francis.zz的博客 4186

Java使用Groovy的方式

Java代码中使用Groovy的详细demo

weixin_47493863的博客 830

java借助groovy混合开发项目,提升项目简洁性和代码质量

在正常情况下,我们肯定会认为 Java 虚拟机是用于运行 Java 语言的,其实这么说并不能说是错误,但是也不完全对,这是因为 Java 虚拟机实际上运行的是特定的二进制字节码文件。实际上 Java 虚拟机和某种语言并没有必然的关联,因为不管什么语言只要能够编译成字节码文件,并符合 Java 虚拟机规范,那么 Java 虚拟机就可以加载该字节码文件,并且执行字节码文件中的指令。JVM 支持的语言:ClojureJRubyGroovyScalaJavaScriptKotlin、…

站在知识源头搞技术 1096

Java项目集成Groovy实战

当然可以。在Maven管理的Java项目中引入Groovy并运行Groovy代码是完全可行的,这能让你在享受Java稳健生态的同时,获得Groovy的灵活和动态特性。

Leon_Jinhai_Sun的博客 771

JAVA中的Groovy

一:什么是Groovy   简单地说, Groovy 是下一代的 java 语言,跟 java 一样 , 它也运行在 JVM 中。作为跑在 JVM 中的另一种语言, groovy 语法与 Java 语言的语法很相似。同时, Groovy 抛弃了 java 烦琐的文法。同样的语句,使用 groovy 能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音。 二:Groovy安...

awing1234的博客 687

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 295
上一篇: Maven支持java与groovy混排
waitgod
博客等级 码龄19年 14粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值