JRT核心竞争力

news2025/1/4 19:50:22

如果说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,我走了两个月。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UDP传输总丢包?常用的解决方式在这里!

UDP是一种无连接的协议&#xff0c;传输数据时不建立连接&#xff0c;因此可能导致数据包丢失。UDP丢包是指在传输过程中由于各种原因导致数据包未能到达目的地。UDP丢包会影响传输的质量和效率&#xff0c;导致数据损失、延迟&#xff0c;甚至导致传输失败。本文将分析UDP丢包…

guns项目 Failed to register @ServerEndpoint class 问题

问题发生所在 socket-business-websocket-7.2.4.jar tomcat发布测试的时候报Failed to register ServerEndpoint class &#xff0c;查询jar报主要是WebSocketServer 类加载有问题&#xff0c;把jar报中该类注掉&#xff0c;重新实现这个类&#xff0c;删除Component注解问题&…

Linux信号之信号的保存

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、阻塞信号 1.信号递达、未决、阻塞 2.内核…

yolov1:背景介绍与算法精讲

目录 一、背景介绍1.1 yolo发展历史1.2 作者介绍 二、算法精讲2.1 预测阶段2.2 训练阶段 三、论文细节 一、背景介绍 其实在写这篇博客的时候yolov1~yolov8的所有网络结构以及算法思想和源码都已经研究很久了&#xff0c;回过头继续读v1会发现有很多细节是自己没有留意的&#…

Linux上新部署的项目jar包没有生效

今天公司新安排了一个项目&#xff0c;这里简称项目A&#xff0c;需要新增两个功能&#xff0c;我这边完成之后&#xff0c;跟前端对接好了&#xff0c;调试也没有问题。 然后把项目打包上传到测试服务器上&#xff0c;重新启动项目&#xff0c;发现项目A新增的接口没有生效&a…

多变量线性回归

一、多维特征 目前为止&#xff0c;我们探讨了单变量/特征的回归模型&#xff0c;现在我们对房价模型增加更多的特征&#xff0c;例如房间数、楼层等&#xff0c;构成一个含有多个变量的模型&#xff0c;模型中的特征为。 增添更多特征后&#xff0c;我们引入一系列新的注释&am…

【数据结构和算法】奇偶链表

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;分离节点后合并 三、代码 3.1 方法一&#xff1a;分离节点后合并 四、复杂度分…

shopee、Lazada、速卖通测评自养号技术,当天注册当天直接下单

自养号测评&#xff08;补单&#xff09;技术对跨境平台如shopee、Lazada、速卖通、ebay、wish、mercari、Newegg等是否有用&#xff1f; 随着越来越多的跨境电商进入市场&#xff0c;并且考虑到亚马逊对大卖家的严格监管&#xff0c;这无疑为其他跨境电商平台和独立站市场带来…

Smallpdf扫描、转换、压缩、编辑、签名PDF

【应用名称】&#xff1a;Smallpdf: 扫描、转换、压缩、编辑、签名PDF 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Smallpdf 【应用版本】&#xff1a;1.71.0 【应用大小】&#xff1a;150MB 【软件说明】&#xff1a;通过 Smallpdf&#xff0c;您可以&…

6.3.1认识Camtasia4(1)

6.3.1认识Camtasia4 安装完Camtasia4(本书使用Camtasia4.0.1版本)后&#xff0c;单击【开始】|【程序】|【Camtasia Studio 4】|【Camtasia Studio】&#xff0c;启动Camtasia Studio&#xff0c;启动后界面如图6-3-1所示。 图6-3-1 Camtasia Studio界面 Camtasia Studio窗口中…

编程笔记 html5cssjs 040 CSS盒子模型

编程笔记 html5&css&js 040 CSS盒子模型 一、CSS 盒子模型二、元素的宽度和高度三、最终元素的总宽度四、元素的总高度五、练习小结 网页是靠分成不同的块&#xff0c;再赋予这些块各不相同的属性来布局的。所以这个“块”是一个基础。先看块本身的构造。 一、CSS 盒子…

shell 循环 判断

for 循环 Shell 脚本里最简单的循环当属 for 循环。最简单的 for 循环如下所示&#xff0c;你只需将变量值依次写在 in 后面即可&#xff1a; #!/bin/bashfor num in 1 2 3 4 doecho $num done 如果要循环的内容是字母表里的连续字母或连续数字&#xff0c;那么就可以按以下语…

医院住院综合服务管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 互…

大模型理论基础1

大模型理论基础1 第一章&#xff1a;引言 语言模型 自回归语言模型 概率的链式法则&#xff1a; 在自回归语言模型 p 中生成整个序列 X1:L&#xff0c;我们需要一次生成一个令牌(token)&#xff0c;该令牌基于之前以生成的令牌进行计算获得&#xff1a; 其中T≥0 是一个控…

OLAP引擎也能实现高性能向量检索,据说QPS高于milvus!

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着 LLM 技术应用及落地&#xff0c;数据库需要提高向量分析以及 AI 支持能力&#xff0c;向量数据库及向量检索等能力“异军突起”&#xff0c;迎来业界持续不断关…

C 程序运行机制

1.编辑 编写C语言源程序代码&#xff0c;源程序文件以“.c”作为扩展名。 2.编译 将C语言源程序转换为目标程序(或目标文件)。如果程序没有错误&#xff0c;没有任何提示&#xff0c;就会生成一个扩展名为“.obj”的二进制文件。C语言中的每条可执行语句经过编译后最终都将被…

深入探索CSS动画的魅力-附带动画实例

一、网页动画发展简史 GIF动画 GIF全称为“Graphics Interchange Format”&#xff0c;是一种基于LZW算法的连续色调无损压缩格式。 由于其文件小、无损压缩、易于播放等优点&#xff0c;GIF成为了网页动画的最初选择。然而&#xff0c;GIF动画的色彩数量和帧数有限&#xff…

YOLOv5姿态估计:HRnet实时检测人体关键点

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下利用YOLOv5进行姿态估计&#xff0c;HRnet与SimDR检测图片、视频以及摄像头中的人体关键点&#xff0c;欢迎大家一起前来探讨学习~ 本文目录&#xff1a; 一、项目准备1Pycharm中克隆github上的项目2.具体步…

森林消防泵:及时扑灭林火,保护森林生态平衡

在大自然中&#xff0c;森林是我们宝贵的自然资源&#xff0c;它们为我们提供氧气、净化空气、保持水土&#xff0c;还是许多动植物的家园。然而&#xff0c;森林火灾却时常威胁着这片绿色宝地的安全。为了保护森林生态环境&#xff0c;我们需要及时扑灭林火。而恒峰智慧科技研…

PhotoMaker, 腾讯开源人像图形处理

腾讯于昨天开源一款人像图形处理项目&#xff0c;项目地址&#xff1a;github.com/TencentARC/PhotoMaker 项目演示地址&#xff1a;https://huggingface.co/spaces/TencentARC/PhotoMakerhttps://huggingface.co/spaces/TencentARC/PhotoMaker-Style 演示效果&#xff1a; 项…