记录一次Chrome浏览器自动排序ajax请求的JSON数据问题 作者作为新人入职的第一天,mentor给了一个维护公司运营平台的小需求,具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。mybatis plus组装排序查询sql,得到排序后的展示记录使用LinkedHashMap根据插入顺序排序,装载展示记录后转成json返回给前端(key为记录的id)最终展示在Chrome浏览器的结果是未排序的原始数据,相当于我查询时候的排序白做了。
【数据库】使用ShardingSphere+Mybatis-Plus实现读写分离 书接上回:数据库调优方案中数据库主从复制,如何实现读写分离ShardingSphere 实现读写分离的方式是通过配置数据源的方式,使得应用程序可以在执行读操作和写操作时分别访问不同的数据库实例。这样可以将读取操作分发到多个从库(从服务器),从而提高读取性能,同时将写操作发送到主库(主服务器)以确保数据的一致性。
【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离) 当数据量过亿时,此时要是延续上面的方案,至少需要10个数据库,当数据量再多,过10亿时,至少需要100个数据库,这是不现实的。还有就是,现实中,一天可能就会产生1000w条数据,两个主数据库的单表会很大,影响读和写的性能。在双主架构中,有两个主数据库实例(也称为主节点),每个主数据库都可以处理读写操作,而不仅仅是一个主数据库处理写操作,另一个主数据库处理读操作。除了普通的用户查询操作,增、删、改操作都包含查询操作,所以说,在一个应用中,查询操作是占比最高的,提高了查询效率,整体性能都会有所提升。
【并发编程】经典线程不安全问题(多线程操作同一个资源容易产生相互覆盖) 高速缓存(Cache)是计算机体系结构中的一种关键性技术,用于提高数据访问速度和系统性能。它在处理器和主内存之间充当了一个临时存储器层,用于暂存常用的数据和指令,以减少处理器对主内存的访问次数,从而提高数据访问速度。高速缓存往内存更新的时机是不确定的,如果数据更新回内存,高速缓存中的数据一定会清除,下次再计算需要重新在内存拷贝一份到高速缓存计算。
【并发编程】详解并发编程中Synchronized的特性(可见性、有序性、可重入性、禁止指令重排序)(๑•̀ㅂ•́)و✧ 假设线程 A 执行 writer()方法,随后线程 B 执行 reader()方法。上述 happens before 关系的图形化表现形式如下:在上图中,每一个箭头链接的两个节点,代表了一个 happens before 关系。黑色箭头表示程序顺序规则;橙色箭头表示监视器锁规则;蓝色箭头表示组合这些规则后提供的 happens before 保证。上图表示在线程 A 释放了锁之后,随后线程 B 获取同一个锁。在上图中,2 happens before 5。
【并发编程】详解并发编程中Synchronized关键字的三种应用方式以及代码讲解(๑•̀ㅂ•́)و✧ 在 Java 中,关键字 synchronized **可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块**(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 Volatile 功能)。
【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文) HttpRequest对象中的属性与HTTP协议中的内容对应,用于后序servlet从request中获取请求中的参数。
【仿写框架之仿写Tomact】一、详解Tomcat的工作流程 当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地理解Tomcat在Java Web开发中的作用。
【JVM】如何判定一个对象已死以及“标记-清除”、“标记-复制”、“标记-整理”三种垃圾收集算法 使用可达性算法分析:通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的(在对象中添加一个引用计数器,每当有地方引用这个对象的时候,引用计数器的值就+1,当引用失效的时候,计数器的值就-1,当引用计数器被减为零的时候,标志着这个对象已经没有引用了,可以回收了!
【JVM】对String::intern()方法深入详解(JDK7及以上)一文搞懂 String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。----书上描述已经包含。。。可能不太好理解。我画图解释方法的执行顺序肯定是从下向上依次执行的。
【并发编程】自研数据同步工具的优化:创建线程池多线程异步去分页调用其他服务接口获取海量数据 上面代码会有一个问题,就是while循环往线程池里扔任务,所有线程在执行时,会在请求数据那里”停留“一段时间,“停留期间”还会一直循环向线程池扔任务,当线程执行完某次请求得到空数据结束循环时,等待队列中还排着大堆任务等着去请求数据。刚开始的设计思路是,,我创建多个服务同时去请求A服务的接口,每个服务都请求到全量数据,由于这些服务都注册在xxl-job上,而且采用的是分片广播的路由策略,那么每个服务就可以只处理请求到的所有数据中。的部分数据,然后交给kafka,由kafka决定这条数据应该放到哪个分区上。
一条sql语句在mysql中如何执行(查询+更新) 连接器主要和身份认证和权限相关的功能相关,就好比一个级别很高的门卫一样。负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作。如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。如果用户名密码认证通过,那么连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。也就是一个用户已经成功建立连接之后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。
[Spring]Spring@Transactional 声明式事务总结(事务的传播行为、事务的使用、@Transactional失效场景) 声明式事务管理是建立在 AOP 之上的。其本质是通过 AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过 @Transactional 注解的方式,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
[数据库]对数据库事务进行总结 事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。
【设计模式】详解观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。(MQ和它有点像)当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。Subject(抽象主题):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者。
【设计模式】详解单例设计模式(包含并发、JVM) 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。