
JavaEE
文章平均质量分 78
to_real
这个作者很懒,什么都没留下…
展开
-
JDK序列化问题
谈到序列化我们自然想到 Java 提供的 Serializable 接口,在 Java 中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。但是在提供很用户简单的调用的同时他也存在很多问题:1、无法跨语言当我们进行跨应用之间的服务调用的时候如果另外一个应用使用c语言来开发,这个时候我们发送过去的序列化对象,别人是无法进行反序列化的因为其内部实现对于别人来说完全就是黑盒。2、序列化之后的码流太大这个我们可以做一个实验还是上一节中的Message类,我们分别用jav原创 2021-06-15 20:20:59 · 238 阅读 · 0 评论 -
亲测双亲委派机制的缺陷及打破双亲委派机制
双亲委派机制时JVM类加载的默认使用的机制,其原理是:当一个类加载器收到类加载任务时,会先交给自己的父加载器去完成,因此最终加载任务都会传递到最顶层的BootstrapClassLoader,只有当父加载器无法完成加载任务时,才会尝试自己来加载。按照由父级到子集的顺序,类加载器主要包含以下几个:BootstrapClassLoader(启动类加载器):主要负责加载核心的类库(java.lang.*等),JVM_HOME/lib目录下的,构造ExtClassLoader和APPClassLoader。原创 2021-06-11 17:43:13 · 1614 阅读 · 0 评论 -
数据库事务
事务并发引发的问题在线购物平台、商品、库存隔离级别1.读未提交2.读已提交3.可重复读4.串行化脏读:读到未提交的数据不可重复读:一个事务中读到不同的结果(读的过程中,别的事务提交了)幻读:查询隔离级别select @@tx_isolation;//设置read uncommitted级别:set session transaction isolation level read uncommitted;//设置read committed级别:s.原创 2021-05-17 22:03:43 · 106 阅读 · 1 评论 -
常见分布式唯一ID生成策略及它们的优缺点对比
全局唯一的 ID 几乎是所有系统都会遇到的刚需。这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义。有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行简单的总结和对比。简单分析一下需求所谓全局唯一的 id 其实往往对应是生成唯一记录标识的业务需求。这个 id 常常是数据库的主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序。这个记录标识上的查询,往往又有分页或者排序的业务需求。所以往往要有一个time字段,并且在t原创 2021-05-13 17:55:09 · 270 阅读 · 0 评论 -
20 个实例玩转 Java 8 Stream
先贴上几个案例,水平高超的同学可以挑战一下:1. 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。2. 统计员工的最高薪资、平均薪资、薪资之和。3. 将员工按薪资从高到低排序,同样薪资者年龄小者在前。4. 将员工按性别分类,将员工按性别和地区分类,将员工按薪资是否高于8000分为两部分。用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda,给我...原创 2021-05-12 14:32:42 · 111 阅读 · 0 评论 -
MySQL 百万级数据,怎么做分页查询
方法1: 直接使用数据库提供的SQL语句 方法2: 建立主键或唯一索引, 利用索引(假设每页10条) 方法3: 基于索引再排序 方法4: 基于索引使用prepare 方法6: 利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 测试实验 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级..原创 2021-05-11 15:13:58 · 223 阅读 · 0 评论 -
雪花算法
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字: 第一个部原创 2021-05-11 11:24:14 · 759 阅读 · 0 评论 -
mysql优化之(use temporary、use filesort)
目录一、use temporary二、use filesort三、extra的其它字段说明一、use temporary为了解决查询,MySQL需要创建一个临时表来容纳结果。use temporary产生条件: 如果GROUP BY 的列没有索引,产生临时表. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表. 如...原创 2021-05-10 18:00:27 · 3360 阅读 · 0 评论 -
MySQL高级之索引面试题分析
索引优化简单案例单表需求:查询category_id为1 且 comments大于1 的情况下,views最多的id1、无索引的情况下:很显然,type是ALL,即最坏的情况,Extra还出现了Using filesort也是最坏的情况,必须优化2、优化一:where条件全部建索引复合索引中的使用到的“comments > 1”是一个范围检索,带来的好处是将type提升为range,只需检索部分索引,但却导致mysql无法利用索引再对后面的vi...原创 2021-05-10 17:48:16 · 129 阅读 · 0 评论 -
Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类
方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId")来指定注入哪一个。方法二:Controller中注入service的时候使用@Resource(type = 类名.class)来指定注入哪一个。方法三: 每个service的impl都可以指定名称(使用@Service(“名称”)) Controller中注入service的时候使用名称来指定注入哪一个(使用@Resource(name="名称"))。..原创 2021-05-10 17:18:34 · 776 阅读 · 0 评论 -
合理地设置线程池的核心线程数
当线程池的核心线程数量过大或者过小有没影响?如何合理地设置线程池的核心线程的数量?这个是在日常开发中程序员在使用线程池时经常需要考虑的问题,下面具体介绍下。1、当线程池的核心线程数量过大或者过小的影响当线程池中核心线程数量过大时,线程与线程之间会争取CPU资源,这样就会导致上下文切换。过多的上下文切换会增加线程的执行时间,影响了整体执行的效率;多线程编程中一般线程的个数都大于CPU核心的个数,而一个CPU核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效的执行,CPU采取的策略是为了每原创 2021-04-30 16:25:01 · 1643 阅读 · 2 评论 -
保障消息100%投递成功、消息幂等性
一、前言我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。如上图:(1)订单服务投递消息给MQ中间件 (2)物流服务监听MQ中间件消息,从而进行消费我们这篇文章讨论一下,如何保障订单服务把消息成功投递给MQ中间件,以RabbitMQ举例。二、分析问题小伙伴们对此会有些疑问,订单服务发起消息服务,返回成功不就成功了吗?如下面的伪代码:上面代码中,一般发送消息就是这么写的..原创 2021-02-24 10:57:38 · 172 阅读 · 0 评论 -
CAP理论的理解
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:一致性(Consistency) 可用性(Availability) 分区容错性(Partition tolerance)最多满足其中的两个特性。也就是下图所描述的。分布式系统要么满足CA,要么CP,要么AP。无法同时满足CAP。 I.什么是 一致性、可用性和分区容错性分区容错性:指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务...原创 2021-02-23 15:06:54 · 239 阅读 · 1 评论 -
Stream原理
Stream的组成与特点Stream(流)是一个来自数据源的元素队列并支持聚合操作: 元素是特定类型的对象,形成一个队列。Java中的Stream并_不会_向集合那样存储和管理元素,而是按需计算 数据源流的来源可以是集合Collection、数组Array、I/O channel, 产生器generator等 聚合操作类似SQL语句一样的操作, 比如filter,map,reduce,find,match,sorted等 和以前的Collection操作不同,...原创 2021-02-20 16:22:51 · 968 阅读 · 0 评论 -
分批处理
//以开业店铺切片分组取值(按现有索引效率最快) List<String> allBusinessStores = userInfoManager.getAllBusinessStores(); if (!CollectionUtils.isEmpty(allBusinessStores)) { Iterable<List<String>> s.原创 2021-02-19 20:52:22 · 114 阅读 · 0 评论 -
代码应用分层
1、背景说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。的确在这些人眼中分层只是一个形式,前辈们的代码这么写的,其他项目代码这么写的,那么我也这么跟着写。但是原创 2021-02-14 13:21:45 · 467 阅读 · 0 评论 -
设计模式通俗
01 工厂方法 02 建造者模式 03 抽象工厂 04 原型模式 05 单态模式 06 适配器模式 07 桥梁模式 08 合成模式 09 装饰模式 10 门面模式 11 享元模式 12 代理模式 13 责任链模式 14 命令模式 15 解释器模式 16 迭代模式 17 调停者模式 18 备忘录模式 19 观察者模式 ..转载 2021-02-04 10:57:57 · 100 阅读 · 0 评论 -
Stream API
1、创建int流2、filter /map /flatMap /peek3、mapToObj /mapToLong / mapToDouble/asLongStream /asDoubleStream4、forEach /forEachOrdered5、 reduce /collect6、distinct /sorted /limit /skip7、sum /min /max /count /average /summaryStatistics8、...原创 2021-02-03 19:26:45 · 93 阅读 · 1 评论 -
又臭又长的if...else
一、又臭又长的if...else废话不多说,先看看下面的代码。public interface IPay { void pay();}@Servicepublic class AliaPay implements IPay { @Override public void pay() { System.out.println("===发起支付宝支付==="); }}@Servicepublic class WeixinPay原创 2021-01-28 16:30:31 · 132 阅读 · 0 评论 -
英文字母的ASCII码值
英文字母的ASCII码值小写字母的ASCII码值比大写字母ASCII码值大32大写字母 十进制ASCII码 小写字母 十进制ASCII码 A 65 a 97 B 66 b 98 C 67 c 99 D 68 d 100 E 69 e 101 F 70 f 102 G 71 g 103 H 72 h 104原创 2020-10-15 16:10:26 · 16557 阅读 · 0 评论 -
InputStream read()方法详解
在Java7中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。 查阅Java7 API,我们可以看到,在InputStream中定义了三个重载的read()方法: 但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法。下面我们来看看这个方法的介绍: 这里有两点需要注意:一是这个方法的返回原创 2020-10-15 15:43:53 · 6856 阅读 · 0 评论 -
Java中getResourceAsStream的用法
首先,Java中的getResourceAsStream有以下几种:1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以..原创 2020-09-28 15:12:26 · 116 阅读 · 0 评论