自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码猿手

欢迎点赞+关注,更多内容请关注:https://www.cnblogs.com/huangrenhui/

  • 博客(61)
  • 收藏
  • 关注

原创 nacos适配SqlServer、Oracle

继上文《》后补充nacos适配SqlServer、Oracle的贴码,主要区别是SqlServer、Oracle的分页SQL有点不一样,做个记录;SqlServer的分页有三种实现方式:offset /fetch next、利用max(主键)、利用row_number关键字;ps:具体可参考《

2023-08-25 13:44:03 2485 7

原创 nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

nacos适配达梦、瀚高、人大金仓数据库

2023-07-21 10:43:57 1599

原创 Feign踩坑源码分析--@FeignClient注入容器

从上面注释可以看出是扫描声明了@FeignClient接口的类,还引入了 FeignClientsRegistrar类,从字面意思可以看出是进行了 FeignClient 客户端类的注册。主要应用了FactoryBean的特性getObject()进行jdk动态创建一个ReflectiveFeign的代理对象。

2023-05-10 16:17:47 2186

原创 Feign踩坑源码分析 -- 请求参数分号变逗号

Feign请求参数分号变逗号的详细探究

2023-03-02 21:12:27 4552

原创 Quartz动态设置并发数量

  quartz存在一个问题,当正在进行的任务已经达到了设置的个数,后续触发的任务没有线程可用,会导致系统宕机;  Quartz通过StdSchedulerFactory工厂创建调度器,initialize方法通过解析quartz.properties配置信息进行加载,默认线程个数为10,可以通过覆盖信息定义线程个数,通过Apollo信息进行线程个数配置 Schedu...

2022-09-27 15:51:00 1320

原创 SpringBoot+jpa适配国产达梦数据库

  依赖:spring-boot-starter-data-jpa等其他Spring依赖版本都是2.1.5 <dependency> <groupId>com.dameng</groupId> <artifactId>Dm8JdbcDriver18</artifactId&gt...

2022-02-17 14:01:00 7691

原创 Spring笔记(10) - 日志体系

一、概况  在项目开发当中,日志对于我们开发或运维人员来说,是一个必不可少的工具。在线下我们可以通过 debug 来查找排除问题,但对于线上系统来说,我们只能通过日志分析来查找问题,我们可以通过日志打印来获取我们需要的信息来判断、分析系统运行结果是否正常或哪里出现了问题,可以定位到具体问题和位置。  当前流行的日志框架有:jul(java util logging) log4j log4j2 jcl(Jakarta Commons Logging) logback slf...

2021-05-09 19:26:25 12588

原创 Spring笔记(9) - IOC实现方式详解

  IOC概念   控制反转(Inversion of Control,IOC),是面向对象编程中的一种设计原则,它建议将不需要的职责移出类,让类专注于核心职责,从而提供松散耦合,提高优化软件程序设计。它把传统上由程序代码直接操控的对象的调用权(new、get等操作对象)交给容器,通过容器来实现对象组件的装配和管理,也就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。 所以Spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之

2021-05-09 19:25:25 15623

原创 Spring笔记(8) - @EventListener注解探究

  在上文中讲了Spring的事件监听机制,流程是:定义事件、监听器,发布事件,控制台输出监听到的事件内容。  在上文的扩展中 使用 @EventListener 注解来自定义监听器,监听指定的事件,比如下面的案例:@Componentpublic class UserManagerListener { //ApplicationEvent能监听到所有的事件,如果为EmailEvent.class则只能监听到关于邮件的事件 //EventListener有两个参数(可以不写,直接

2021-05-09 19:24:34 13399

原创 Spring笔记(7) - Spring的事件和监听机制

一.背景  事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework。  在 Java 语言中,Java 的事件机制参与者有3种角色:    1.Event Source:具体的事件源,比如说,你在界面点击一个 button 按钮,那么这个按钮就是事件源,要想使按钮对某些事件进行响应,你就需要注册特定的监听器 listener,事件源将事件对象传递给所有注册的监听器;    2.Event Object:事件状态对象

2021-05-09 19:15:10 13467 2

原创 Mysql 5.7-- 存储过程

存储过程:对sql的封装和重用,经编译创建并保存在数据库中,通过指定存储过程的名字并给定参数(需要时)来调用执行。 优缺点: (1) 优点: 执行速度快------存储过程只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句没执行一次就需编译一次,所以使用存储过程可提高数据库的执行速度; 减少网络通信量------当对数据库进行复杂操作时,(如对多个表进行insert、update、select、delete时)可将这些复杂操作用存储过程封装起来与数据库...

2021-05-09 19:06:28 13834 1

原创 Spring Framework自动装配setAutowireMode和Mybatis案例的源码探究

  由前文可得知,Spring Framework的自动装配有两种方式:xml配置和注解配置;  自动装配的类型有:  (1)xml配置中的byType根据类型查找(@Autowired注解是默认根据类型查找,类型查找不到会使用名称查找);  (2)xml配置中的byName根据名称查找,它是xml配置中根据setter方法来查找(@Resource注解也是根据名称查找,但它是根据属性名称来查找,跟setter方法无关,所以setter方法可以不用写,可以使用type指定类);  如果没有.

2021-05-09 12:24:11 7165 2

原创 Mybatis的初始化和结合Spring Framework后初始化的源码探究

  带着下面的问题进行学习:  (1)Mybatis 框架或 Spring Framework 框架对数据层 Mapper 接口做了代理,那是做了 JDK 动态代理还是 CGLIB 代理?  (2)Mapper 接口使用和不使用@Mapper 注解有什么区别?  (3)Spring Framework 框架引入 Mybatis 的 jar 包后,Spring Framework 是怎么管理的?  (4)@MapperScan注解的作用是什么?  在探究上面的问题前,先了解什么是 Fac.

2021-05-07 23:03:29 7329 4

原创 Mybatis一级缓存和结合Spring Framework后失效的源码探究

Mybatis 的一级缓存是会话级别的缓存(单线程的,特别鸡肋),Mybatis 每创建一个 SqlSession 会话对象,就表示打开一次数据库会话,在一次会话中,应用程序很可能在短时间内反复执行相同的查询语句,如果不对数据进行缓存,则每查询一次就要执行一次数据库查询,这就造成数据库资源的浪费。将每次的查询结果缓存起来,再次执行查询的时候,会先查询一级缓存(默认开启的),如果命中,则直接返回,否则再去查询数据库并放入缓存中。(3)上面的案例是 select 语句,返回结果是List集合,所以进入。

2021-04-27 22:51:02 6554

原创 Proxy.newProxyInstance源码探究

 JDK动态代理案例实现:实现InvocationHandler 接口重写 invoke 方法,其中包含一个对象变量和提供一个包含对象的构造方法;public class MyInvocationHandler implements InvocationHandler { Object target;//目标对象 public MyInvocationHandler(Object target){ this.target=target; } /** .

2021-04-25 22:51:45 7832

原创 Java代理简述

  1.什么是代理?  对类或对象(目标对象)进行增强功能,最终形成一个新的代理对象,(Spring Framework中)当应用调用该对象(目标对象)的方法时,实际调用的是代理对象增强后的方法,比如对功能方法login实现日志记录,可以通过代理实现;  PS:目标对象--被增强的对象;代理对象--增强后的对象;  2.为什么需要代理?  一些类里面的方法有相同的代码或类中有相同的功能,可以将这些相同抽取出来形成一个公共的方法或功能,但Java有两个重要的原则:单一职责(对类来说的,即一

2021-04-24 19:06:55 6506

原创 Spring(11) - Introductions进行类扩展方法

  Introductions(引用),在 Aspect 中称为类型间的声明,使切面能够声明被通知的对象(拦截的对象)实现给定的接口,并提供该接口的实现。  简单点说可以将一个类的实现方法复制到未实现的类中。  通过@DeclareParents 注解进行声明,声明在一个父类型的属性上(比如接口),其中注解的属性 value 指定对哪些路径(包)下的类进行类方法扩展,defaultImpl 指定以哪个类为模板。  如下案例:  1)切面类:@Aspect@Componentpub.

2021-04-22 22:15:08 6499

原创 Two modules in a project cannot share content root

  idea的Project Structur -> Modules 对 module 进行修改点击应用或保存时出现问题,报下图的错误:  解决办法:将“my-project_main"或”spring-framework-5.0.x-my-project_main"中选择一个进行删除,只保留一个就可以。  PS:网上的“先删除全部依赖(Libraries和Modules中的Dependencies),再一次添加依赖”该操作无法解决问题...

2021-04-15 22:49:15 7979

原创 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题

  今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地电脑内存不大(只有8G),导致下载数据时报堆内存溢出,下载失败。Exception data: java.lang.OutOfMemoryErrorat jxl.write.biff.MemoryDataOutput.write(MemoryDataOutput.java:72)at jxl.wr

2021-04-01 22:09:27 7018

原创 Mybatis日志源码探究

一.项目搭建  1.pom.xml<dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>

2021-03-29 19:49:09 7204

原创 SpringBoot自动配置源码探究

@SpringBootApplication @SpringBootApplication表示SpringBoot应用,标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就运行这个类的main方法来启动应用; @SpringBootApplication是组合注解 @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConf..

2021-03-15 22:21:48 7487

原创 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑

  1.现象描述  (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接。在其中,if标签中经常会有xxx !=''这种判断,若 number 类型的字段上传递的值为 0, 执行更新时会发现数据库中的数据并没有被更新成 0,这种异常现象不会报错,所以容易被忽视。 <update id="update" parameterType="com.hrh.mybatis.bean.Person"> update tab_..

2021-03-13 14:29:05 8047

原创 自己挖的坑自己填--maven打jar包部署服务器报错

  1.今天 mvn install 后把 jar 包部署到服务器上,执行 java -jar xx.jar 报 “no main manifest attribute,in xx.jar”  解决办法:在pom.xml中添加下面配置<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.pl

2021-03-08 20:42:31 7467

原创 Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

一.背景  在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了BeanPostProcessor是一个bean后置处理器(bean创建对象初始化前后进行拦截工作)。  BeanPostProcessor的运行流程如下:    1)Spring IOC容器实例化Bean;    2)调用BeanPostProcessor的postProcessBeforeIn

2020-11-01 22:45:41 14096 1

原创 正则表达式性能优化的探究

一.背景  前文的String字符串性能优化的探究中的第3点讲述了Split() 方法使用了正则表达式实现了其强大的分割功能,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题。那么今天详细探讨下正则表达式。  正则表达式是计算机科学的一个概念,很多语言都实现了它。正则表达式使用一些特定的元字符来检索、匹配以及替换符合规定的字符串。  构造正则表达式语法的元字符,由普通字符、标准字符、限定字符(量词)、定位符(边界字符)组成,详情如下图: ...

2020-10-29 22:54:40 13940

原创 String字符串性能优化的探究

一.背景  String 对象是我们使用最频繁的一个对象类型,但它的性能问题却是最容易被忽略的。String 对象作为 Java 语言中重要的数据类型,是内存中占用空间最大的一个对象,高效地使用字符串,可以提升系统的整体性能,比如百M内存轻松存储几十G数据。  如果不正确对待 String 对象,则可能导致一些问题的发生,比如因为使用了正则表达式对字符串进行匹配,从而导致并发瓶颈。  接下来我们就从 String 对象的实现、特性以及实际使用中的优化三方面入手,深入了解。二.String对象

2020-10-28 22:20:46 13554 1

原创 Spring笔记(5) - 声明式事务@EnableTransactionManagement注解源码分析

一.背景  前面详解了实现Spring事务的两种方式的不同实现:编程式事务和声明式事务,对于配置都使用到了xml配置,今天介绍Spring事务的注解开发,例如下面例子:配置类:注册数据源、JDBC模板、事务管理器 //包扫描,将包下的dao、service注册到Spring容器中@ComponentScan("com.hrh")//开启基于注解的事务管理,跟@Transactional注解配套使用@EnableTransactionManagement//表明TxConfig是配置类@

2020-10-26 21:56:57 12967

原创 Spring笔记(4) - Spring的编程式事务和声明式事务详解

一.背景事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保证用户和银行的利益都不受损失。 事务特性 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性(Con

2020-10-21 08:48:40 13082

原创 Jenkins+tomcat自动发布的热部署/重启及遇到的坑解决办法

一.背景  公司的项目一直手动maven打包、上传服务器、关闭/开启tomcat,整个流程下来耗时耗力,虽然可以将所有流程通过shell脚本一次性解决,但如果可以通过idea的Jenkins插件一键自动部署,那更省时省力。  下面是一个简单的发布tomcat的shell脚本,执行下面脚本的前提是要在服务器中安装了git、maven# 先关闭tomcat进程kill -9 `ps aux|grep tomcat|grep -v 'grep'| awk 'NR==1{print $2}'`#

2020-07-10 10:37:03 19373

原创 Spring笔记(3) - SpringAOP基础详解和源码探究

案例 @EnableAspectJAutoProxy//开启基于注解的aop模式@Configurationpublic class AOPConfig { //业务逻辑类加入容器中 @Bean public MathCalculator mathCalculator() { return new MathCalculator(); } //切面类加入容器中 @Bean public LogAspects logAspec..

2020-07-03 10:45:39 11658

原创 多线程高并发编程(12) -- 阻塞算法实现ArrayBlockingQueue源码分析

一.前言  前文探究了非阻塞算法的实现ConcurrentLinkedQueue安全队列,也说明了阻塞算法实现的两种方式,使用一把锁(出队和入队同一把锁ArrayBlockingQueue)和两把锁(出队和入队各一把锁LinkedBlockingQueue)来实现,今天来探究下ArrayBlockingQueue。  ArrayBlockingQueue是一个阻塞队列,底层使用数组结构实现,按照先进先出(FIFO)的原则对元素进行排序。  ArrayBlockingQueue是一个线程安全的集合

2020-06-25 10:37:39 11779

原创 多线程高并发编程(11) -- 非阻塞算法实现ConcurrentLinkedQueue源码分析

  一.背景  要实现对队列的安全访问,有两种方式:阻塞算法和非阻塞算法。阻塞算法的实现是使用一把锁(出队和入队同一把锁ArrayBlockingQueue)和两把锁(出队和入队各一把锁LinkedBlockingQueue)来实现;非阻塞算法使用自旋+CAS实现。  阻塞,顾名思义:当我们的生产者向队列中生产数据时,若队列已满,那么生产线程会暂停下来,直到队列中有可以存放数据的地...

2020-06-17 17:23:00 11178

原创 多线程高并发编程(10) -- ConcurrentHashMap源码分析

  一.背景  前文讲了HashMap的源码分析,从中可以看到下面的问题:HashMap的put/remove方法不是线程安全的,如果在多线程并发环境下,使用synchronized进行加锁,会导致效率低下;在遍历迭代获取时进行修改(put/remove)操作,会导致发生并发修改异常(ConcurrentModificationException);在JDK1.7之前,对Has...

2020-06-14 18:27:00 11895

原创 Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析

一.生命周期@Bean自定义初始化和销毁方法//====xml方式: init-method和destroy-method==== <bean id="person" class="com.hrh.bean.Person" scope="singleton" init-method="" destroy-method=""> <prop...

2020-05-31 22:46:00 10648

原创 Spring笔记(1) - 组件注册及部分源码解析

@Bean:类注入容器xml方式:<bean id="person" class="com.hrh.bean.Person"> <property name="name" value="张三"></property> <property name="age" value="20"></property&gt...

2020-05-26 22:28:00 10588

原创 HashMap源码和并发异常问题分析

要点源码分析HashMap允许键值对为null;HashTable则不允许,会报空指针异常; HashMap<String, String> map= new HashMap<>(2); map.put(null,null); map.put("1",null);HashMap初始容量是16,扩容方...

2020-05-26 14:39:00 14043

原创 自己挖的坑自己填--开发问题记录

StringButils.isBlank/isNotBlank:if(param==null||"".equals(param.trim()){....}if(!(param==null||"".equals(param.trim())){....}//使用isBlank/isNotBlank代替上面代码,更有可读性if (StringUtils.isBlank(charge...

2020-05-15 10:37:00 12887

原创 多线程高并发编程(9) -- CopyOnWrite写入时复制

  CopyOnWrite写入时复制  CopyOnWrite,即快照模式,写入时复制就是不同线程访问同一资源的时候,会获取相同的指针指向这个资源,只有在写操作,才会去复制一份新的数据,然后新的数据在被写操作完后立马被其他线程看到最新的数据变化,然后之前获取的指针会指向新的数据,但在写操作未结束时,其他线程仍然能访问最初的资源。此做法主要的优点是如果没有线程进行写操作,就不会进行数据副...

2020-05-14 16:24:00 11688

原创 多线程高并发编程(8) -- Fork/Join源码分析

一.概念  Fork/Join就是将一个大任务分解(fork)成许多个独立的小任务,然后多线程并行去处理这些小任务,每个小任务处理完得到结果再进行合并(join)得到最终的结果。  流程:任务继承RecursiveTask,重写compute方法,使用ForkJoinPool的submit提交任务,任务在某个线程中运行,工作任务中的compute方法的代码开始对任务进行分析,如果符...

2020-05-11 18:11:00 10652 1

原创 多线程高并发编程(7) -- Future源码分析

一.概念  A Future计算的结果。 提供方法来检查计算是否完成,等待其完成,并检索计算结果。 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪。 取消由cancel方法执行。 提供其他方法来确定任务是否正常完成或被取消。 计算完成后,不能取消计算。 如果您想使用Future ,以便不可撤销,但不提供可用的结果,则可以声明Future<?>表格的...

2020-05-05 16:17:00 11646

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除