JRT核心竞争力

如果说JRT业务脚本化和发部署简单和打印导出客户端都不足以抵挡Spring用的人多的优势的话。那么这一篇让DolerGet给你一个选择JRT的理由,借助JRT自我实现的ORM,JRT有能力完全把控更新数据和删除数据的口径,和能够准确知道哪些是热点数据,进而构建可靠的缓存机制来供多维查询使用。而关系库最大的痛点也就是多维查询不方便。

本次测试就是验证DolerGet的性能,相同查询使用DolerGet和不使用能达到上百倍的性能差异,看图和测试代码说话,完全不输Cache的¥get性能,对¥d的效果可以增加字段解决。

不使用DolerGet查询数据
在这里插入图片描述

使用DolerGet查询数据
在这里插入图片描述

缓存千万个表数据的内存情况,算的可能不那么准,反正整个tomcat占用4G左右,我就是花几个G缓存千万级别的热点数据也毫无压力
在这里插入图片描述

测试代码

import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 测试DolerGet和不用DolerGet的性能差别以及在哈希表放千万行数据的内存占用
 *
 */
public class ashDolerGetTest extends BaseHttpHandlerNoSession {
    /**
     * 大哈希内存测试,测试缓存对象的内存占用情况
     * @return
     */
    public String LargeHashTest() throws Exception
    {
        ConcurrentHashMap<String, Object> hsData = new ConcurrentHashMap<>();
        List<JRTPrintTemplateEleRetDto> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEleRetDto.class,null);
        long startMemorySize = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
        for(int i=0;i<10000000;i++)
        {
            hsData.put(i+"",JRT.Core.Util.ReflectUtil.CloneObject(eleList.get(0)));
        }
        long endMemorySize = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
        long useSize=(endMemorySize-startMemorySize)/ (1024 * 1024);
        hsData.clear();
        hsData=null;
        return "一千万对象数据大概内存是:"+useSize+"兆";
    }

    /**
     * 不用DolerGet查询数据
     * @return
     */
    public String NoDolerGet() throws Exception
    {
        long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
        //查询所有表里面的元素
        List<JRTPrintTemplateEleRetDto> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEleRetDto.class,null);
        int getNum=0;
        for(JRTPrintTemplateEleRetDto ele:eleList)
        {
            for(int i=0;i<2000;i++) {
                //取模板信息
                JRTPrintTemplate tmp = EntityManager().GetById(JRTPrintTemplate.class, ele.PrintTemplateDR);
                ele.TemplateCode=tmp.Code;
                ele.TemplateName=tmp.CName;
                //取纸张信息
                if(tmp.JRTPrintPaperDR!=null)
                {
                    JRTPrintPaper paper=EntityManager().GetById(JRTPrintPaper.class,tmp.JRTPrintPaperDR);
                    ele.TemplatePaper=paper.CName;
                    getNum++;
                }
                getNum++;
            }
        }
        long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
        return "消耗时间:"+(end-start)+",获取次数:"+getNum+",数据行数:"+eleList.size()+",数据:"+Helper.Object2Json(eleList);
    }

    /**
     * 用DolerGet查询数据
     * @return
     */
    public String DolerGet() throws Exception
    {
        long start=JRT.Core.Util.TimeParser.GetTimeInMillis();
        //查询所有表里面的元素
        List<JRTPrintTemplateEleRetDto> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEleRetDto.class,null);
        int getNum=0;
        for(JRTPrintTemplateEleRetDto ele:eleList)
        {
            for(int i=0;i<2000;i++) {
                //取模板信息
                JRTPrintTemplate tmp = EntityManager().DolerGet(JRTPrintTemplate.class, ele.PrintTemplateDR);
                ele.TemplateCode=tmp.Code;
                ele.TemplateName=tmp.CName;
                //取纸张信息
                if(tmp.JRTPrintPaperDR!=null)
                {
                    JRTPrintPaper paper=EntityManager().DolerGet(JRTPrintPaper.class,tmp.JRTPrintPaperDR);
                    ele.TemplatePaper=paper.CName;
                    getNum++;
                }
                getNum++;
            }
        }
        long end=JRT.Core.Util.TimeParser.GetTimeInMillis();
        return "消耗时间:"+(end-start)+",获取次数:"+getNum+",数据行数:"+eleList.size()+",数据:"+Helper.Object2Json(eleList);
    }

    /**
     * 查看缓存数据
     * @return
     * @throws Exception
     */
    public String View() throws Exception
    {
        return JRT.DAL.ORM.Global.GlobalManager.ViewGlobalJson();
    }

    /**
     * 查看缓存队列数据
     * @return
     * @throws Exception
     */
    public String ViewQuen() throws Exception
    {
        return JRT.DAL.ORM.Global.GlobalManager.ViewGlobalTaskQuenDate();
    }

    /**
     * 返回模板元素数据实体
     */
    public static class JRTPrintTemplateEleRetDto extends JRTPrintTemplateEle {
        /**
         * 模板代码
         */
        public String TemplateCode;

        /**
         * 模板名称
         */
        public String TemplateName;

        /**
         * 模板纸张
         */
        public String TemplatePaper;
    }
}

DolerGet来源于Cache数据库的¥get命令,使用了十年Cache库,既用了SQL模式的ORM,也用了M的代码,我深知M的强大优势。通过使用过程我发现Cache也不是那么神奇,在ECP上一直¥d不存在的global,他的性能是指数级下降。这个现象说明了什么?

说明Cache没有缓存不存在的global,他的¥g和¥d也是在内存缓存的,只是他是数据库一体的,所以他能得到更新和删除数据操作来保证缓存可靠。所以$g能达到极高的多维爬行效果。那么我把控ORM的修改和删除API,也能实现可靠的多维爬行效果。

我22年深入学习了FreeRTOS,并且参照着撸了一版简化OS,实现了线程调度。对OS的理解从来那么深入过,我深知在OS和硬件层面没什么特殊路子。就是c比较字符串就得一个个字符比,不会因为语言低级而得到简化。所以Cache的M爬数据块肯定不是什么特异功能,应该是来自M和数据库在一体带来的优势。

基于此基础,已经可以做到不输Cache的效果;超低的学习成本、超低的开发和部署成本、很高的开发效率、完全信创的客户端程序、可靠高性能的多维查询、BS的打印设计器、基于关系库开发一套优秀的系统已经依稀可见,要么不做,要做就得奔着最优秀的做。

保持自己的主见,不人云亦云,人用亦用,多问几个为什么,深入理解业务场景,为业务做框架,不为框架而框架。从量变到质变我走了十年,从C#到JAVA,我走了两个月。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

细说JavaScript内置对象(JavaScript内置对象详解)

一、String对象 1、简单上手 2、构造方法 3、其他方法 3.1、charAt() 3.2、indexOf() 3.3、split() 3.4、substring() 3.5、substr() 4、实际操作 二、Math对象 1、简单上手 2、对象属性 3、对象方法 4、实际操作 三、Date对象 1、简单上手 2、构造方法 3、实…

Java零基础教学文档servlet(2)

【Servlet】 1.工程结构 2.J2EE平台 Java EE&#xff0c;Java平台企业版&#xff08;Java Platform Enterprise Edition&#xff09;&#xff0c;之前称为Java 2 Platform, Enterprise Edition (J2EE)&#xff0c;2018年3月更名为Jakarta EE。是Sun公司为企业级应用推出的标准…

Java实现高校大学生创业管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎&#xff1a;从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

时刻不忘为何而出发

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Linux内核架构和工作原理详解(一)

简介 作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内核启动init程序…

Bug:Goland左侧丢失项目结构(Goland常用快捷键)

Goland快捷键&小tips 1 常用快捷键 # 格式化代码 optioncommandL# 在项目中搜索文件中的内容 commandshiftF# 搜索.go文件 shiftshift&#xff08;按两次shift&#xff09;# 修改方法、变量&#xff08;同时替换引用处的名称&#xff09; fnshiftF6# 将选中代码抽取为方法…

QQ视频聊天怎么录制

虽然微信几乎成为主流的聊天工具&#xff0c;但是不可否认的是QQ视频聊天仍有他的趣味所在&#xff0c;多种特效在视频的时候增加乐趣&#xff0c;那么如果QQ视频聊天的时候可以录制聊天内容吗&#xff1f;当然是可以的。可以使用电脑自带的视频录制工具&#xff0c;或者QQ自带…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

EOCR电动机保护器故障原因查询

在电动机保护方面&#xff0c;电子式电机保护器的应用越来越广泛。电子式电动机保护器可靠性强、灵敏度高&#xff0c;并具有多种保护功能&#xff0c;如&#xff1a;过电流、欠电流、缺相、逆相、堵转、三相不平衡、接地、短路等。 但有一部分电子式电动机保护器产品在检测到…

自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结&#xff1a; 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化&#xff0c;因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…

Redcap UE camping相关规定

在接入网络时&#xff0c;可以通过系统信息的配置分别允许具有 1 个 Rx branch和 2 个 Rx branches的 RedCap UE接入。 此外&#xff0c;半双工 FDD RedCap UE也可以通过系统信息控制其接入。网络端会在在 SIB1 中提供 RedCap 特定的 Intra Frequency Reselection Indication&a…

CVE-2023-50290 Apache Solr 敏感信息泄露

项目介绍 Apache Solr 是流行的、速度极快的开源搜索平台&#xff0c;可满足您的所有企业、电子商务和分析需求&#xff0c;基于Apache Lucene构建。 项目地址 https://solr.apache.org 漏洞概述 Apache Solr 中未经授权的参与者漏洞暴露敏感信息。 Solr Metrics API 发布…

音频文件格式–celt

CELT介绍 CELT 是一种开放、免版税的有损音频压缩格式&#xff0c;也是一种免费软件编解码器&#xff0c;具有特别低的算法延迟&#xff0c;适用于低延迟音频通信。这些算法是公开记录的&#xff0c;并且可以不受软件专利限制地使用。 CELT 是一种基于改进的离散余弦变换 (MD…

vue中使用高德地图渲染多个不同类型的点,根据勾选数据 类型不同打点显示隐藏

一、在index.html文件中引入高德地图JavaScript API的2.0版本SDK <script src"https://webapi.amap.com/maps?v2.0&key你的高德地图Key"></script>二、创建一个Vue组件&#xff0c;用于渲染地图和点位 html <template><div class"m…

科研绘图(八)线性热图

线性热图&#xff08;Linear Heat Map&#xff09;是一种数据可视化技术&#xff0c;用于展示数值在一维线性空间上的分布情况。它通常用于展示沿着一条线&#xff08;例如时间线或任何一维序列&#xff09;的数据密度或强度变化。线性热图与传统的二维热图不同&#xff0c;后者…

Python-面向对象

面向对象 1.初识对象1.1理解使用对象完成数据组织的思路 2.成员方法2.1类的定义和使用语法2.2成员方法的使用 3.类和对象4.构造方法4.1使用构造方法向成员变量赋值 5.其他内置方法5.1__str__字符串方法5.2__lt__小于符号比较方法5.3__le__小于等于比较符号5.4__eq__比较运算符实…

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 佣金倍数提现

本文来自应用中心-9999款应用在线选购 "佣金倍数提现"这个概念在不同的上下文中可能有不同的含义&#xff0c;但通常它涉及到基于用户赚取的佣金来设定提现条件。这是一种常见的机制&#xff0c;尤其是在那些提供佣金或回扣的平台上&#xff0c;如联盟营销、金融交易…

网络安全工程师必备证书有哪些?

&#x1f4d5;网络环境之间的竞争&#xff0c;归根到底优秀人才之间的竞争。网络安全工程师必备证书有哪些? 1️⃣NISP国家信息安全资格证书 NISP被称称作“校园版CISP”&#xff0c;获得了网络空间安全领域广泛承认的行业认证&#xff0c;是信息安全专业的必考资格证书&#…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…