- 博客(125)
- 收藏
- 关注
原创 浅谈Java泛型的类型推断
function2T 返回类型是 T,但 map 方法并不知道 T 的具体类型,编译器无法从 function2T 的返回类型 T 推断出 R 的具体类型,因为 T 是一个泛型类型参数,而不是具体的类型。在这里,T 的类型是由 Set< T > 的声明决定的。编译器知道 result 的类型是 Set< T >,因此可以推断出的返回类型是 T。是一个新的泛型类型参数。编译器需要从上下文中推断出 R 的具体类型。诶,我这function2T明明返回的就是T类型的呀?中,map 方法的返回类型是。
2025-03-03 20:05:44
293
原创 Java常用注解--@FunctionalInterface 函数式接口
必须是一个接口有且仅有一个抽象方法(允许包含默认方法或静态方法)。使用注解标记,编译器会强制校验是否符合条件。// 唯一抽象方法// 什么也不干,谁实现的就干什么// 默认方法不计入抽象方法数量// 模拟异步操作}).start();// 调用如何简化?// 定义回调接口// 使用回调try {// 调用时需实现所有方法(即使不关心某些情况)@Override@Override// 即使不需要处理失败,也必须实现空方法});问题。
2025-02-20 16:46:54
754
原创 TiDB热点问题
按时间不停写入的数据,不停的在增长的有序数据,与AUTO_INCREMENT的主键类似,它也会不停的往最后一个range进行写入,因此最后一个range会成为热点。常见的 increment 类型自增主键就是顺序递增的,默认情况下,在主键为整数型时,会用主键值当做 RowID ,此时 RowID 为顺序递增,在大量 insert 时形成表的写入热点。TiDB的数据是按照有序的range进行划分的,主键自增,会导致写入都发生在做最后的range上,因此最后的range会是热点。来生成主键,将主键做了随机化。
2024-07-17 17:30:17
790
原创 Spring aop切面编程
注解用于标记在需要进行审计日志记录的方法上,通过指定操作类型和目标表来描述该方法的行为。这种标记方式为 AOP 提供了一个“切入点”(Pointcut),使得 AOP 可以识别出哪些方法需要进行特定的处理。,它通过 AOP 拦截所有标记了。
2024-05-08 14:51:56
560
1
原创 Java CompletableFuture结合线程池 - 异步多线程
CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,完美弥补了Future的局限性,同时 CompletableFuture 实现了对任务编排的能力。借助这项能力,可以轻松地组织不同任务的运行顺序、规则以及方式。
2024-04-09 11:18:00
569
原创 TiDB分布式关系型数据库
TiDB 是一个开源的分布式关系型数据库,由 PingCAP 公司主导开发。它的设计目标是提供水平可扩展的高性能分布式事务数据库,同时保持与 MySQL 协议的兼容性和事务的 ACID(原子性、一致性、隔离性和持久性)特性。水平扩展:TiDB 支持无缝的水平扩展,能够通过增加新节点来应对增长的数据量和事务负载。分布式事务:TiDB 提供完全的分布式事务支持,采用了基于 Google Percolator 模型的事务算法,可以提供跨节点的一致性。
2024-03-15 17:35:43
504
原创 HBase非关系型数据库
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库。HBase是一个NoSQL数据库,把数据存在HDFS上,低成本来存储海量的数据并且支持高并发随机写和实时查询。HBase 的原型: Google 的 BigTable 论文。
2024-03-11 16:15:15
1258
原创 Spark scala如何本地运行
运行一个spark任务需要打包任务并上传到spark集群上运行,但是往往远端运行时间较长、众多处理器的日志收集困难,导致spark任务的调试时间成本很高,几个小时的等待可能换来的只是一个低级的错误。Apache Spark是一个开源的大数据处理框架,它提供了一个接口用于编程大规模分布式计算,且提供了很多高级工具,包括支持SQL查询、流数据处理、机器学习和图计算等。那么如何不提交远端Spark集群,在本地就像调试Java代码一样调试Spark scala。
2024-02-06 17:29:24
897
原创 Spark如何用repartition来提升执行效率
在这种情况下,Spark会尽量保证每个分区中的数据量大致相等,但并不能保证每个分区中的数据在业务逻辑上的均匀分布。也就是说,如果你的数据在某个特定的列上有特定的分布模式,那么在重新分区后,这种分布模式可能会被打乱。果在调用 repartition 方法时没有指定列,那么Spark会将数据均匀地分布到指定数量的分区中,但具体的分区策略是不确定的。需要注意的是,repartition 操作会引发全量数据的洗牌,可能会消耗大量的计算和I/O资源,因此在使用时需要谨慎考虑。
2024-02-02 17:03:50
1015
原创 Spark如何用累加器Accumulator收集日志
Spark任务的实际运算是交由众多executor来执行的,如果再执行算子内部打印日志,是需要到对应的executor上才能看到。当不知道对应executor的情况下就需要挨个查询日志,是否不方便。是否有办法可以收集所有executor上的日志内容打印在driver上呢?这样就可以直接在stdout里看到所有日志。
2024-01-30 17:00:58
580
原创 Spark性能调优
2.1 增加大数据量位置的repartition数。2.2 增加spark session的超时时间。1 首先可以尝试开大executor的内存分配。
2024-01-30 15:24:36
697
原创 为什么写进MySQL里的数据顺序乱了?
使用Collectors.groupingBy收集器对流(Stream)中的元素进行分组时,默认情况下会使用ArrayList来收集同一组内的元素,List的顺序是按照它们在流中出现的顺序添加的。但是因为因为HashMap不保证顺序,key的迭代顺序可能与元素被插入到Map中的顺序不同。
2024-01-23 11:31:07
959
原创 Http请求类型GET, POST, PUT
用于提交请求,可以更新或者创建资源,是非幂等的,举个例子:在用户注册功能上,每次提交都是创建一个用户账号,这个时候就用POST。目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据。用于向指定URL传送更新资源,是幂等的。每次请求都只是覆盖原先的值,当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。跟GET功能类似,但是报文中不返回文件主体(只返回到head line)。用于检查文件,而不是真的获取文件内容。
2023-10-07 16:12:09
191
原创 Hive实战-表创建
ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式。通过实测,储存空间被压缩为默认的1/3。对比默认数据储存格式。
2023-09-27 10:34:42
778
原创 Java中使用Thrift
需要注意的是,transport 客户端要和服务端对应,比如如果要对 NIO 模型的服务端进行调研,transport 就必须使用 TFramedTransport或TFastFramedTransport。业务代码中只需要注入 SimpleService.Iface,并直接调用接口方法,而完全不需要关注内部逻辑实现。通过 thrift compiler 生成 java 代码。client端可以直接调用接口,二不用关心具体的实现类。之后将相应的 Iface 注册到 IOC 容器中即可。
2023-07-19 15:01:39
1542
原创 O/R Mapping 对象关系映射
ORM(Object-Relational Mapping)是一种将对象模型和关系型数据库之间的映射关系进行自动化转换的技术。ORM 的目标是将对象模型和关系型数据库之间的转换过程自动化,使开发人员可以使用面向对象的方式来操作数据库,从而提高开发效率和代码质量。对象和关系之间的映射关系定义。数据库操作的自动化,包括 CRUD 操作、事务管理等。
2023-07-17 20:31:04
367
原创 Spring Actuator 监控管理
Spring Actuator 是 Spring Boot 提供的一个功能强大的监控和管理端点。它提供了一系列的 HTTP 端点,可以用来监控应用程序的运行状态、健康状况、性能指标等信息。这些端点可以通过 HTTP 或 JMX 访问。但是因为安全因素,所以需要另外设置才能打开這些 endpoint。引入依赖后,SpringBoot 在运行时就會自动开启。这两个endpoint。
2023-07-17 15:14:54
634
原创 Java虚拟机(JVM)
类模板对象,其实就是 Java 类在 JVM 内存中的一个快照,JVM 将从字节码文件中解析出的常量池、类字段、类方法等信息存储到模板中,这样 JVM 在运行期便能通过类模板而获取 Java 类中的任意信息,能够对 Java 类的成员变量进行遍历,也能进行 Java 方法的调用。初始化(Initialization):在初始化阶段,JVM会执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。类的初始化是在首次使用该类时进行的,它确保类的静态资源被正确初始化,并且只会执行一次。
2023-07-12 15:04:34
276
原创 解释执行和编译执行
C, C++, Java(Java是一种特殊的编译执行语言,它将源代码编译为字节码文件,然后在Java虚拟机上解释执行字节码)
2023-07-10 18:59:42
596
原创 Java Spring多线程
对于 Future.get()方法返回的结果,一个重要的事情是,只有提交的任务实现了java.util.concurrent.Callable接口时才返回 Future。如果所有的线程都在忙于执行任务并且又有新的任务到来了,这个线程池将创建一个新的线程并将其提交到 Executor。此方法用于取消已提交任务的执行。如果任务完成,结果将立即返回给调用者,否则调用者将被阻塞,直到 Executor 完成此操作的执行并计算出结果。但是,如果管理得不合理,或者任务不是很短的,则线程池将包含大量的活动线程。
2023-06-30 11:05:58
1224
原创 Aviator-Java轻量级高性能Java表达式求值
在上述代码中,首先定义表达式字符串,然后使用AviatorEvaluator的compile()方法编译表达式,将表达式编译成可执行的对象。接着,准备参数并执行表达式,最后输出结果。AviatorScript 文档 https://www.yuque.com/boyan-avfmj/aviatorscript/ashevw。Aviator是一款Java语言编写的轻量级高性能Java表达式求值库,支持java基本类型、字符串、日期、集合、数组等类型的表达式求值运算。
2023-04-27 11:23:04
412
原创 Spring中的设计模式及使用示例
设计模式是指在面向对象软件设计中常见的解决特定问题的方法。设计模式不是一段可复制粘贴的代码,而是一种通用解决方案,可以帮助开发者更好地组织代码、提高代码的可复用性、扩展性和可维护性。常见的设计模式包括单例模式、工厂模式、命令模式、观察者模式、责任链模式等等。每个设计模式都有其内部机制,其核心思想在于相似的问题有相似的解法,将这些解法规则化后,通过加以应用和变通,就可以避免重复的代码和架构设计。
2023-04-26 21:43:45
929
原创 抽象同步队列AbstractQueuedSynchronizer(AQS)简要理解
AQS(AbstractQueuedSynchronizer)是 Java 中实现锁和同步器的基础设施,它是一个抽象类,提供了构建锁和同步器的基本框架,可以用于实现 ReentrantLock、Semaphore、CountDownLatch 等同步器。A Q S定义了一套多线程访问共享资源的同步模板,解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作。
2023-04-19 16:13:05
720
原创 Java基本类型和包装类型int和Integer
该错误提示表明你在处理一个Optional类型的参数时,传入的参数中包含一个名为hasRef的int类型参数,但是无法将它转换为一个null值,因为该参数被声明为基本数据类型int。基本数据类型是无法赋值为null的,因此将一个Optional的参数传递给一个接收int类型参数的方法,如果传递的参数值为null或者Optional未被设置值,则会导致此类型的错误。总结来说,基本类型用于表示普通的数据类型,快速处理数字。在这种情况下,可以使用Optional类型的参数来代替Optional类型的参数。
2023-04-17 17:26:54
358
原创 Java和Spring常用注解汇总
在Spring框架中,@Component和@Service都是用来将一个Java类标记为Spring容器中的一个组件。不过,在实际开发中,@Service通常用于标记业务层的Bean,而@Component则更为通用,可以用于标记任意层的Bean。具体而言,@Component表示通用的组件,可以用在任何层次。它是一个比较抽象的概念,可以用于标记任何需要被Spring容器管理的组件类。而@Service则表示服务层组件,用于标记服务层(业务层)的Bean。
2023-04-13 11:50:14
748
原创 Java的语言特性
机器码(Machine Code)是计算机能够直接执行的最底层的指令集合,它表示计算机硬件上具体的操作。例如,将两个数相加,将一个值存储到内存中等操作。机器码由二进制代码组成,被计算机硬件直接识别并执行。机器码通常是由计算机的汇编器生成的,汇编器会将汇编语言程序翻译成机器码。机器码是计算机最底层的指令,直接由计算机的硬件进行执行,因此它具有高效、快速的特点。虽然机器码非常有效,但是它很难进行人工编写和阅读。因此,程序员通常使用高级编程语言编写程序,并使用编译器将高级语言编译成机器码。
2023-04-13 11:24:22
454
原创 Java数据结构实现及效率
移除set元素,调用remove方法,底层实际上是调用HashMap的remove方法删除指定Entry,时间复杂度是O(1),因此效率高。添加set元素,调用add方法,底层实际上是调用HashMap的put()方法添加key-value对,时间复杂度O(1),因此效率高。获取set元素,需要调用iterator方法,返回的元素无序,因此需要遍历集合,时间复杂度O(N),效率低下。TreeMapget操作的时间复杂度是O(log(n))的,相比于HashMap的O(1)还是差不少的。
2023-03-20 16:04:59
392
原创 Spring事务抽象
玩转Spring全家桶 学习笔记Spring事务传播特性Spring中通过Propagation来设置事务的传播属性的,在这个属性中提供了我们其中关于事务传播的特性:PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。默认PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRE
2022-02-28 16:49:58
266
原创 应对不合法输入的策略
应对不合法输入的策略接受不接受接受catch异常,返回一个可接受的值,比如:(),“”不接受中断:Exception,return
2021-12-30 21:34:15
254
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人