• Action模型:读未提交的并发性能,可串行化的隔离效果,一个具有创新性的Java中间件
    Action模型概述Action模型系本人基于Java语言研发的一套中间件。作为一个中间件,其在理论上的最大亮点在于:在Action模型提供的可串行化(Serializable)这一事务隔离级别下,可以达到读未提交(Read Uncommitted)这一事务隔离级别的并发性能(这就要求位于Action模型之下的DBMS仅提供读未提交的事务隔离级别即可)。事实上,Action模型向上层(即业务层)总共提供三种事务隔离级别:可串行化、混合可串行化(此隔离级别属于本人自创)、严格可串行化(Strict Serializable)。也就是说,Action模型最低的事务隔离级别就是可串行化,并且在此事务隔离级别下可以达成读未提交一级的并发性能。这就真正达成了一种鱼和熊掌可以得兼的效果。Action模型在实践上的最大亮点在于如下三点:- 无需考虑并发的并发模型(Concurrency);- 无需时间输入的时间模型(Time);- N元关联也支持Qualifier的关联模型(Association)。并且以上所有亮点都是以免程序员的方式实现。应用Action模型的步骤如下:- 应用一个增强型UML模型编辑器(注意这里不是传统的UML,而是经过扩展后的增强型UML,传统的UML由于在这一方面的表达能力不足,因此无法但此重任)进行建模;- 将建好的模型自动输出为XML文件;- 应用代码自动生成器,以上一步的XML文件作为输入,自动生成完整的中间层代码API(也包含SQL代码);当Action模型的代码生成完毕之后,有三种应用途径:- 由程序员进行业务代码的编写工作;- 由低代码/无代码平台构建业务代码;- 由AIGC生成业务代码。无论那一种途径,只要在业务代码中调用前面生成的中间层代码API,就可以使得开发的系统自动具有上面所描述的几个特征,例如,无需考虑并发、无需考虑时间输入、无需考虑低级别事务隔离级别所带来的种种缺点、等等。我之所以能够一个人进行Action模型的研发,代码自动生成技术(其属于MDA,即模型驱动架构,的一部分)起了非常关键的作用。否则,仅凭我一人之力,单单是百分之百正确率的敲代码的工作量就是一项个人难以完成的任务。Action模型既非来自开源软件,自身也未开源,属于本人自创的一套软件体系。目前已经适配MySQL和MSSQL。Action模型的一个重要特性是支持强一致性(即读操作一定能够读取到在其之前最近的写操作所写入的数据),单机版本的Action模型对此没有任何问题,一主多从版本的Action模型对此也没有任何问题。Action模型的另一个重要特性是原生地具有防篡改的特性。只要位于其下的DBMS能够保证无法直接对数据库表文件进行篡改,就可以保证应用Action模型的系统无法对系统中的任何数据进行篡改。当前流行的微服务架构比较适合高并发和简单业务场景的系统,而Action模型则适合于中高并发和复杂业务场景的系统。因此微服务架构比较适合于电商等应用,而Action模型则比较适合于金融、ERP、OA等企业级应用。Action模型与当前比较流行的低代码/无代码开发平台的侧重点各不相同:Action模型因为是一个中间件,因此侧重于后台底层代码的自动生成,而当前的低代码/无代码开发平台最弱的地方就在于这一部分。因此Action模型如果与当前的低代码/无代码开发平台进行结合,将可以产生相得益彰的效果。当然,如果不与当前的低代码/无代码开发平台相结合,则也可以直接利用Action模型进行业务系统的开发,只是现在业务代码的开发需要程序员来完成而已。Action模型与当前大热的AIGC之间的关系:由于Action模型在中间层就提供了并发、时间、关联的支持,因此可以大大降低AIGC生成代码的难度,因为现在AIGC仅需考虑业务逻辑,即专注于业务代码的生成。就以并发为例,如果没有Action模型,如果你对AIGC说基于中间层提供的API生成业务代码,并加上考虑并发和不考虑并发这两个选项,则不考虑并发所生成的代码的质量和考虑并发所生成的代码的质量是截然不同的。这个大家在最近国内比较热的大模型Kimi上试试看就知道了。众所周知,芯片的生产包含制造、封装和测试这三大步骤,如果我们将Action模型比作一个芯片,则目前为止其核心模块的制造过程已经基本完成,就剩下封装和测试这两大步骤还需完善。这里所谓的封装即是Action模型与各种框架的集成。开始时我使用的框架是Struts2,但是目前已经转到Spring Boot,转到后者的主要原因是其比较简洁,这样就可以使开发的工作量主要用在Action模型上。最早的代码开发环境和测试环境如下:Windows + JDK8 + EclipseSDK + MSSql2012Dev + Struts2 + Tomcat和JBoss/Wildfly;后来新增的代码开发和测试环境如下:Ubuntu + OpenJDK17 + Eclipse202303 + MySql + Spring Boot + Tomcat;这里所谓的测试就是软件测试。我已经针对Action模型进行了一些测试,不过由于人力所限,虽然通过这些测试发现了不少的Bug,也解决了这些Bug,但是仍旧可能会存在一些Bug。可以通过编写大量应用Action模型的实例的办法对Action模型进行进一步的测试,而这是单靠我一个人无法完成的。这就意味着,实现Action模型的三个环节中难度最大,重要性最高的制造环节已经完成,再往后就是工作量的问题。实际上,在我编写的一个测试用例中,同时开450个Runnable链(可以将1个Runnable链视为1个事务),其中共有三种类型的长短事务,每种150个,并且将其运行在一台只有16线程CPU的笔记本上,可以确保这其中既不会有死锁,也不会有数据竞争发生,这里的技术含量就无需赘述了。以Action模型为核心的一系列技术基本上都由本人独立研发而成,本人承担了百分之九十九的工作量,并具有百分之一百的知识产权,因此完全可以采用双方都认可的任何方式进行合作。如果对这套中间件感兴趣的话,我还可以提供更详细的资料,并且可以到贵处进行现场演示和交流。
  • [技术干货] UML(统一建模语言)建模工具及类图画法的详细介绍
    一、UML概述软件开发生命周期:做需求-->形成文档-->系统设计-->开发人员编写代码-->测试-->运维……在系统设计过程的时候,我们需要“画图纸”,这时候就可以使用UML来进行画图,所以也可以把UML叫做图形化语言(图标化语言),他不仅仅应用于Java,可以应用于各种面向对象的系统。二、UML建模工具能够实现UML图的建模工具有:IBM - Rational RoseSybase - Power Designer韩国 - StarUML(简称:SU)MS - Visiohttps://www.processon.com/ 【processon】http://www.fynote.com/【枫叶云笔记】 三、UML类图(一)、什么是类图?定义系统中的类,描述类的内部结构 (属性, 方法等),表示类之间的关系 (泛化、实现、依赖、关联、聚合、组合);(二)、类在UML中的表示-- 名称部分(Name) : 在顶端存放;-- 属性部分(Attribute) : 在中间存放属性,属性类型(AttributeType),初始值(InitialValue);-- 方法部分(Operation) : 底部存放操作,参数表(arg:ArgumentType),返回值(ReturnType); (三)、注释部分注释和类直接的连线一般用虚线(四)、属性部分属性语法[可见性]属性名[ :类型][ =初始值][{属性字符串}] ;注意 : [] 中的内容可有可无 ;属性字符串用来指定关于属性的其它信息 , 不一定是是属性值, 如果希望添加一个属性定义规则 , 但是没地方添加, 可以写在属性字符串中 ;属性的可见性属性的可见性只有公有(public + ),私有(private - ),受保护(protected # ), UML中不存在默认, 如果没有显示任何符号, 就表示没有定义该属性;公有 : 用 "+" 表示, 可以在此类的外部使用查看该属性;私有 : 用 "-" 表示, 不可以从外部类中访问该属性;保护 : 用 "#" 表示, 常与 泛化一起使用;(五)、类的方法部分方法语法[可见性]操作名[( 参数表 )][ : 返回类型][ { 属性字符串 } ]注意 : [] 中的内容可有可无 ;注意:如果有多个参数列表的话,中间用逗号隔开方法的可见性可见性 : 主要包括 公有(public +), 私有(private -), 受保护(protected #), 包内公有(package ~);-- 公有 : 用 "+" 表示, 只要调用对象能访问操作所在的包, 就能访问公有操作;-- 私有 : 用 "-" 表示, 同一个类的对象才能调用私有的操作;-- 保护 : 用 "#" 表示, 子类对象才可以调用受保护操作;-- 包内 : 用 "~" 表示, 同一个包内的对象才可以调用包内公有的操作;