- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 分布式锁的实现与应用
分布式锁是控制分布式系统不同进程并发访问共享资源的一种锁的实现。如果不同主机之间共享了某个临界资源(例如数据库中的数据),往往需要互斥来防止彼此干扰,以保证一致性。作用:分布式集群中多个服务请求同一方法或者同一个业务操作(比如秒杀)的情况下,对应的业务逻辑只能被一台机器上的一个线程执行,避免出现并发安全问题。
2023-08-14 20:56:30
308
原创 业务中的SQL优化
使用背景:在某一查询中,需要根据从企业信息表查询到的每个企业的更新人id,到员工表中查询更新人的姓名,一起返回到前端。按照普通的思路,那肯定就是先查询企业信息表得到一个list,再对list进行for循环,为每一个元素查询对应的更新人id。这种做法在for循环中进行了数据库查询,多次访问数据库,会导致查询效率降低且增加了数据库压力。
2023-08-02 15:54:08
245
原创 Java 业务开发常见错误 100 例 -- 学习笔记 -- 3
使用抽象类,对统一方法进行实现而遗留不相同的方法给子类实现(模板方法模式),再在使用时选择对应的bean进行注入即可使用spring完成工厂模式,从而降低代码重复度。当重复代码中出现bug时,如果重复次数过多或对代码结构不了解,很有可能会出现改bug改了一半的情况,所以消除重复代码可以从一定程度上提高代码的可维护性。比如在DO和DTO中有大量属性需要赋值时,就可以使用这种方法,之前还真写过DTO和DO对象之间十几行属性的赋值,早知道就好了捏。“许多涉及类结构性的通用处理,都可以按照这个模式来减少重复代码”
2023-07-03 20:13:23
424
原创 Java 业务开发常见错误 100 例 -- 学习笔记 -- 2
没看懂,先码上(确保正确处理了线程池中任务的异常,如果任务通过 execute 提交,那么出现异常会导致线程退出,大量的异常会导致线程重复创建引起性能问题,我们应该尽可能确保任务不出异常,同时设置默认的未捕获异常处理程序来兜底;当使用finally释放资源时,如果finally中也有抛出异常时,由于一个方法不能出现两个异常,所以finally抛出的异常有可能会把try中的异常覆盖,从而导致更难发现问题。因为,不同序列化算法输出必定不同,要正确处理序列化后的数据就要使用相同的反序列化算法。
2023-06-30 14:56:21
406
原创 Java 业务开发常见错误 100 例 -- 学习笔记
看到这里我对其中的第一点感受尤为深刻,依稀记得软件工程导论项目验收的前一晚上,我们匆匆忙忙的开始测试,所有业务都可以按照我们正常的逻辑完成预期的任务,但是如果按照非主流逻辑,程序的bug就变得层出不穷,例如:电话号码的填写,前后端都没有做校验,最后就导致电话号码可以是中文而不会报错。关于第二点,我的评价是和真正生产环境的文档比起来,之前我们自己造的文档只能叫电子垃圾,相比较而言真的没什么设计可言。绑定的任务对于线程池属性的偏好,如果希望减少任务间的相互干扰,考虑按需使用隔离的线程池。
2023-06-27 19:29:46
686
原创 基于ZooKeeper临时顺序节点的分布式锁实现
基于临时顺序节点的锁实现原理是,在ZooKeeper中创建一个临时顺序节点,每个客户端都可以创建这样的节点。如果是,那么它获得了锁,如果不是,那么它会监视比自己小的节点的删除事件,直到这些节点被删除,然后再次尝试获取锁。与临时节点不同的是,临时顺序节点也会根据节点的创建顺序为节点分配一个唯一的编号。基于临时节点的锁实现原理是,在ZooKeeper中创建一个临时节点,这个节点就是锁的代表。如果应用场景中锁的获取和释放频率较高,且需要保证客户端获取锁的顺序和避免死锁的情况,那么基于临时顺序节点的锁更为合适。
2023-04-27 15:39:51
304
原创 编译原理作业
创建字符集,表现为往字符集表中添加新的行。在这个函数中,首先计算出新的 segmentId,然后创建一个新的 CharSet 对象,初始化其各个属性,包括 indexId、segmentId、fromChar 和 toChar,最后将该对象添加到字符集表中,返回新的字符集 id。该函数首先创建一个新的字符集对象,并且通过遍历输入的两个字符集,将它们的内容合并到新的字符集对象中。该函数接收两个字符作为参数,将它们作为一个字符集中的两个段进行组合,并将新创建的字符集添加到字符集表中,返回字符集的id。
2023-03-06 23:36:59
434
1
原创 常见的查询优化器
数据库主要由三部分组成,分别是解析器、优化器和执行引擎,其中优化器是把关系表达式转换成执行计划的核心组件,很大程度上决定了一个系统的性能。
2023-01-14 17:23:51
359
原创 Flink引擎
什么是大数据指无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。批计算和流计算的区别为什么需要流计算大数据的实时性带来价值更大,eg:实时推荐、数据监控Flink的特点高吞吐低延迟,实时快速高容错流批一体。
2023-01-14 17:22:43
135
原创 Java实现简单的区块链
区块链可以简单抽象成将一个个区块存放在一个链表中,每新增一个块就把它放置在链表尾端,并通过区块之间信息的传递形成独一无二的hash,来确保区块链的数据未被篡改过。
2023-01-14 17:19:05
1968
原创 Java的JNI机制-简单实践
注意这里运行时会报错undefined reference to 'WinMain',因为我们的项目没有main函数,但报错并不影响dll文件的生成和使用。接着我们在CLion中新建一个C++项目,引入刚刚生成的头文件并导入jni相关头文件(在JDK文件夹中)直接运行项目,我们可以在cmake-build-debug文件夹下找到生成的dll文件。创建好后,接着点击构建按钮,会出现一个out文件夹,也就是生成的class文件在其中。将生成的dll文件加载到Java程序中,运行即可得到结果。
2023-01-14 17:14:28
327
原创 Java - PriorityQueue 优先队列
最近遇到一道算法题,说难其实也不难,但是用之前的思路和知识总感觉很麻烦很耗时。在看高手解析时发现了一种新思路,即使用PriorityQueue来取最大值和最小值。在此记录。
2023-01-04 12:23:46
148
原创 网络通信–你画我猜
网络通信–你画我猜1. 服务器和客户端的连接首先在服务器生成一个ServerSocket类型的对象(包括端口编号),等待socket对象与之连接(ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求 accept() 方法就会一直等待,直到接收到了连接请求才返回。);在客户端生成一个Socket对象(包括网络IP地址和端口号)。二者连接成功则可进行后续操作。//服务器类中private Serv
2022-01-22 18:49:21
592
原创 五子棋初体验
经过将近一个月的学习,我初步掌握了Java一些简单的绘图和监听器功能,最近利用一个月以来学的知识写了一个简易的五子棋,今天稍作总结。目录实现五子棋的基本步骤:1.设置游戏界面,绘制棋盘2.绘制棋子,实现下棋操作3.判断输赢4.设置各种功能按钮准备工作创建接口,设置五子棋游戏的相关参数,以便于后续操作public interface Config { //棋盘最左侧与窗体左边界间距 public static final int X0 = 5...
2021-08-26 00:03:21
1167
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人