JAVA
文章平均质量分 84
冬天里的懒猫
这个作者很懒,什么都没留下…
展开
-
在windows上编译Inlong所遇到的问题
1.Hadoop相关的问题在windows中,由于Inlong的很多单元测试用例都需要用到hadoop的相关组件进行测试。可以采用winunits配合测试,winutils是windows上专门配合hadoop和yarn测试的工具。在github上下载该工具:git clone https://github.com/steveloughran/winutils.git之后选择一个版本,配置环境变量:HADOOP_HOME D:\workspace\github-work\winutils\原创 2022-04-30 20:34:42 · 1078 阅读 · 1 评论 -
Druid源码阅读10-DruidDataSource中的一些计数器
在Druid连接池的工作过程中,会用到一些计数器对Druid的情况进行判断。然后根据计数器的数据采取一系列操作,整理如下:1.统计类的计数器变量名类型说明connectCountlonggetConnectionInternal被调用之后就会增加,意味着连接被get的次数。closeCountlong连接调用recycle中,包括回收、关闭等情况,成功之后会增加,标识连接关闭的次数。recycleCountlong连接调用recycle成功之后才会增加,不包原创 2021-11-19 20:48:50 · 1246 阅读 · 0 评论 -
Druid源码阅读9-DruidDataSource和DruidConnection中的状态
DruidPooledConnection中的状态:字段类型所在类默认值说明closedvolatile booleanDruidPooledConnectionfalse关闭状态,recycle到连接池中的连接会修改为true。但是这个状态通常只在checkStateInternal中单独使用。判断连接是否关闭需要结合(closed or disable)disablevolatile booleanDruidPooledConnectionfal原创 2021-11-18 18:20:57 · 924 阅读 · 0 评论 -
Druid源码阅读8-DruidDataSource的removeAbandoned机制
有关于Druid的removeAbandoned机制,在getConnection源码中介绍过。removeAbandoned实际上就是Druid的泄露检测机制。主要的参数有:参数说明removeAbandoned如果连接泄露,是否需要回收泄露的连接,默认false;logAbandoned如果回收了泄露的连接,是否要打印一条log,默认false;removeAbandonedTimeoutMillis连接回收的超时时间,默认5分钟;removeAbandon原创 2021-11-17 18:39:18 · 1191 阅读 · 0 评论 -
Druid源码阅读7-DruidDataSource的recycle过程
Druid中的Connection在使用之后,要进行回收,而回收连接的方法就是recucle方法。回收的主要目的是将连接的状态清空/重置之后,放置到连接池的connections数组的尾部,然后发送连接池lock的notEmpty条件变量通知消息,让等待的消费者线程来获取连接。1.回收过程回收方法首先要做的是,判断回收线程是否为同一个线程。如果不是,则打印日志输出。if (logDifferentThread // && (!isAsyncCloseConnectionEna原创 2021-11-16 19:40:09 · 895 阅读 · 0 评论 -
Druid源码阅读6-PreparedStatementPool源码及使用场景分析
**在阅读DruidDataSource源码的过程中,发现DruidConnectionHolder有个特别的属性PreparedStatementPool statementPool。根据经验可知,这是DruidPreparedStatement进行缓存的cache。我们在使用PreparedStatement的过程中,由于PreparedStatement对sql语句的解析和参数的注入是分开的,因此,加入cache之后,可以在同一个连接上,对相同sql,不同参数的请求进行复用。1.开启参数如果要原创 2021-11-15 20:19:11 · 1737 阅读 · 0 评论 -
Druid源码阅读5-DruidDataSource的shrink过程
shrink方法是DestroyTask线程中回收连接的具体执行方法。首先获得锁:try { lock.lockInterruptibly();} catch (InterruptedException e) { return;}之后,要判断初始化状态是否完成,如果采用异步初始化,可能DestoryTask线程已经启动,但是连接池还没有初始化完成。if (!inited) { return;}之后对连接池中的连接进行遍历,connections中,可连接的连接数记原创 2021-11-13 23:23:03 · 973 阅读 · 0 评论 -
Druid源码阅读4-DruidDataSource的getConnection过程
DruidDataSource连接池实现了javaX.sql包中,DataSource接口的全部方法。getConnection也来自于javaX.sql.DataSource接口。而DruidPooledConnection也实现了接口java.sql.Connection。这样就能在各种场景中通过这个接口来获取数据库连接。1.fileter处理–责任链模式在执行getConnection方法的过程中,首先确认DataSource是否完成了初始化。由于 init方法采用了Double Check机原创 2021-11-11 14:38:53 · 1883 阅读 · 0 评论 -
Druid源码阅读3-DruidDataSource连接池的基本原理
DruidDataSource数据库连接池的的本质,实际上是一个利用ReentrentLock和两个Condition组成的生产者和消费者模型。1.DruidDataSource中的锁在DruidAbstractDataSource类中,定义了一个非常重要的锁,几乎所有的线程都使用到了这个锁。//可重入锁 lockprotected ReentrantLock lock;//非空条件变量protected Condition原创 2021-11-10 16:34:39 · 1942 阅读 · 0 评论 -
Druid源码阅读2-DruidDataSource的init过程
DruidDataSource的使用都是创建DruidDataSource对象,set配置参数之后,调用init方法。通过mock测试实例化DruidDataSource:DruidDataSource ds = new DruidDataSource();ds.setUrl("jdbc:fake:dragoon_v25masterdb");ds.setUsername("tddl5");ds.setPassword("tddl5");ds.setFilters("stat");ds.init原创 2021-11-09 18:24:03 · 1792 阅读 · 0 评论 -
Druid源码阅读1-DruidDataSource数据结构
DruidDataSource是DruidCP最关键的类之一,承载了连接池的启动、关闭、以及连接的获取和管理等功能。其内部关键的的数据结构如下表:nametype说明connectionsvolatile DruidConnectionHolder[]pool的关键数组,存放连接,实际上是DruidConnectionHolder的数组。Connection由DruidConnectionHolder持有evictConnectionsDruidConnectionHo原创 2021-11-08 20:26:42 · 736 阅读 · 0 评论 -
RabbitMQ在Springboot下的使用
在springboot下操作rabbitMQ。1.pom文件配置pom文件配置如下: <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </depen原创 2021-11-02 15:43:22 · 1272 阅读 · 0 评论 -
在Dubbo中基于Hmily TCC实现银行转账
文章目录1.背景知识1.1 BASE 柔性事物1.2 BASE柔性事物的常见模式1.3 hmily1.4 案例说明2.数据库设计2.1 账户相关的表2.2 TCC相关的表3.Dubbo project配置3.1 project规划3.2 pom文件3.2.1 父项目的pom文件3.2.2 api的pom文件3.2.3 orm的pom文件3.2.4 bank1的pom文件3.2.5 bank2的pom文件3.2.6 client的pom文件3.3 yml配置文件3.3.1 bank1的yml配置3.原创 2021-10-14 13:35:05 · 451 阅读 · 1 评论 -
在Springboot中使用ThreadPoolExecutor线程池
在springboot项目中如果需要用到ThreadPoolExecutor线程池的话是非常方便的。比使用java并发包中的Executors都还方便很多。实际上spring中的线程池ThreadpoolExecutor只是对java并发包中的线程池的封装。这样便于在spring环境中快速使用。通过几个注解即可,降低了对代码的侵入性。1.ThreadPoolExecutor配置在本文中,将使用spring提供的ThreadPoolTaskExecutor进行配置。1.1 yml中的配置参数配置参数原创 2021-09-17 15:10:34 · 3162 阅读 · 1 评论 -
不同的数据库连接池(DBCP,C3P0,Druid,Hikari)下对mysql的随机update和insert性能对比
第二部分,对insert和update进行测试:1 环境准备分别准备了Insert和Update两种场景,其中,对于Update场景,还准备了通过索引更新和不走索引更新两种情况。1.1 Update代码如下:package com.dhb.gts.javacourse.week6.mysqltest;import com.dhb.gts.javacourse.fluent.dao.intf.OrderSummaryDao;import com.dhb.gts.javacourse.fluen原创 2021-09-14 17:41:30 · 607 阅读 · 1 评论 -
不同的数据库连接池(DBCP,C3P0,Druid,Hikari)下对mysql的insert和select性能对比
分别测试4中连接池(DBCP、C3P0、Druid、Hikari)的表现情况。1.环境准备1.1 连接池配置1.1.1 DBCPgradle导入包;implementation 'org.apache.commons:commons-dbcp2:2.9.0'application.yml配置:# DBCPspring.datasource.url: jdbc:mysql://192.168.162.49:3306/gts?useSSL=false&autoReconnect=tru原创 2021-09-14 11:37:41 · 730 阅读 · 0 评论 -
将MapperScan错误使用导致的BindingException问题
文章目录1.环境说明2.问题说明3.问题分析在前面的代码中,使用fluent mybatis的mapper对表进行增删改查都没有问题。但是fluent mybatis官方也说了,自动会生成dao层代码,将dao及其实现类都生成好了。因此也想尝试下生成的代码使用的效果。此外,由于不想建多个project来进行测试,因此对于不同的测试,都在src/main/java下面弄各种不同的包来进行区分。本次测试的package:com.dhb.gts.javacourse.week6.mysqltest目录。1原创 2021-09-13 18:20:01 · 558 阅读 · 0 评论 -
在gradle6.9中使用fluent mybatis
文章目录1.gradle配置2.生成代码3.增删改查测试mybatis generator生成的mapper中,只有一些简陋的基本操作代码。如果要对一张表进行比较复杂的sql操作,或者使用到聚合函数的时候。在之前的mybatis框架中就只能人工通过硬编码的方式来实现。定义xml或者通过注解来完成。实现这种扩展的sql增强的框架也有很多。常见的如 mybatis plus,MyBatis Dynamic SQL和Fluent mybatis。目前Fluent Mybatis在一众mybatis 增强框架原创 2021-09-13 11:27:27 · 325 阅读 · 0 评论 -
在gradle6.9环境中对Mybatis Generators中TypeHandler的使用
文章目录1.TypeHandler2.generatorConfig.xml3.代码生成4.Starter5.运行测试在进行mybatis开发的过程中,我们经常会遇到此类问题:如mysql的表中的日期为字符串,但是我们在java中希望按照Date类型进行操作。因此,我们需要用到mybatis中的typeHandler。本文就是一个将数据库中 String类型存储的字段 createDate,其格式为“yyyy-MM-ddHH:mm:ss”,通过TypeHandler转换为Date操作的实例。1.Ty原创 2021-09-07 16:20:22 · 195 阅读 · 0 评论 -
基于Gradle6.9配置MyBatis Generators 逆向生成ORM代码
最近将springboot相关的项目都迁移到了gradle,通过gradle进行编译,这个实现过程比较曲折。由于gradle的后向兼容一直很差,这导致如果是最新版本的gradle7.1.1版本,很可能之前的build.gradle中的配置无法使用。这里需要说明一下就是,gradle环境下,相关的插件都是采用ant的方式来使用。1. build.gradle配置完整配置如下:plugins { id 'org.springframework.boot' version '2.5.3'原创 2021-09-06 16:24:33 · 316 阅读 · 0 评论 -
Spring Bean 的装配方式以及Autowired与Resource的使用及区别
文章目录1.Spring的自动装配2.xml配置实现装配2.1 xml实现基本的装配2.2 xml通过byName实现自动装配2.3 xml通过byType实现自动装配2.4 xml通过constructor实现自动装配2.@Autowired实现装配2.1 注解在属性上2.2 注解在构造函数上2.3 注解在Set方法上2.4 测试3.@Resource实现装配3.1 注解在属性上3.2 注解在set方法上3.3 @Resource测试:4.@Autowired与@Resource的比较1.Spring的原创 2021-08-31 19:10:50 · 422 阅读 · 0 评论 -
JAVA中各种单例模式的实现与分析
文章目录1.饿汉式单例模式--采用静态常量的方式2.饿汉式单例模式--采用静态代码块的方式3.懒汉式单例模式--基本实现4.懒汉式单例模式--在方法上加锁5.懒汉式单例模式--在方法内部加同步代码块6.懒汉式单例模式--Double Check7.懒汉式单例模式--Double Check + volatile8.懒汉式单利模式--静态内部类9.懒汉式单利模式--利用枚举单例模式是学习设计模式过程中最基本的一个设计模式,基本上一开始学习就会学到单例模式,实际上在java中实现单例模式有很多种写法,不同写法原创 2021-08-30 16:27:24 · 137 阅读 · 0 评论 -
什么是并发、高并发以及实现高并发需要考虑的因素
文章目录1.什么是并发2.什么是高并发3.实现高并发需要考虑的因素3.1 高性能3.1.1 网络3.1.2 CPU3.1.3 内存3.1.3.4 IO3.2 高可用性3.3 高扩展性3.4 安全性1.什么是并发说到并发,期英文单词为Conurrent,如果要彻底理解并发,那么还需知道一个词就是并行,英文单词Parallel。那么二者有什么关系呢?Erlang 之父 Joe Armstrong用如下图来解释了并发与并行的区别:并发是两个队列交替使用一台咖啡机,而并行则是两个队列同时使用两台咖啡机。原创 2021-08-27 20:05:29 · 3843 阅读 · 0 评论 -
对常用的并发操作 API 和工具类的总结
1. ReentrantLockJava并发包中通过Lock和Condition两个接口来实现管程,Lock用于解决互斥问题,Condition用于解决同步问题。对于互斥问题,在java中,已经有synchronized了,通过synchronized,配合Object的wait、notify/notifyAll方法,同样也能很好的实现互斥和同步。在jdk1.7之前的版本中,由于synchronized存在严重的性能问题,但是到了jdk1.8,synchronized进行了优化,性能上与Lock的实现原创 2021-08-26 18:27:22 · 277 阅读 · 0 评论 -
一个多线程异步执行面试题的多种解决方法
文章目录1.问题2.解决方法2.1 线程的Join方法2.2 共享volatile变量2.3 synchronized锁2.4 wait+notify/notifyAll2.5 park/unpark2.6 ReentrantLock可重入锁2.7 ReentrantLock配合Condation2.8 CountDownLatch2.9 CyclicBarrier2.10 Semaphore2.11 Phaser2.12 Exchanger2.13 BlockingQueue2.14 Synchronou原创 2021-08-25 14:28:42 · 481 阅读 · 0 评论 -
解决github提交代码Support for password authentication was removed 问题
一大早发现周末的代码commit之后没有push。按照之前的常规操作,采用用户名+密码的方式,通过https的方式push代码。结果出现如下错误:remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.remote: Please see https://github.blog/2020-12-15-token-authen原创 2021-08-16 14:48:31 · 4584 阅读 · 0 评论 -
四种方式实现HttpServer并测试负载能力
1.ServerSocket实现httpServer1.1 阻塞式代码:package com.dhb.gts.javacourse.week2;import java.io.IOException;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.TimeUnit;//单线程的socket程序public class H原创 2021-08-13 16:20:56 · 400 阅读 · 0 评论 -
java8 各种GC的总结
1. jvm1.8的内存布局java的内存布局大致如下图所示:2. 垃圾确认的方法引用计数法:给对象添加一个引用计数器,当有一个地方引用时,计数器就加1,当引用失效时,计数器就减1。任何时刻只要计数器为0则回收。但是这种算法无法解决对象之间互相循环引用的问题。如A引用B,而B又引用A,计数器永远不为0,这两个对象再也无任何引用。这样GC不能回收这两个对象。可达性分析法:通过GCRoots的对象作为起点,从这些节点向下搜索,搜索走过的路径称之为引用链(Reference Chain),当一个对原创 2021-08-11 17:17:40 · 1498 阅读 · 0 评论 -
在windows上通过choco安装superbenchmarker进行压测
文章目录1.安装choco2.安装superbenchmarker3.启动gateway4.执行superbenchmarker1.安装choco在windows中用管理员身份运行Powershell,之后执行如下代码:Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::Securi原创 2021-08-10 14:36:13 · 137 阅读 · 0 评论 -
Jvm线程堆分析
idea的线程stack信息:D:\workspace-mashibing\geektime-study>jstack 60362021-08-10 11:41:02Full thread dump OpenJDK 64-Bit Server VM (11.0.8+10-b944.31 mixed mode):Threads class SMR info:_java_thread_list=0x00000000704861e0, length=55, elements={0x000000原创 2021-08-10 13:37:15 · 815 阅读 · 0 评论 -
JVM(1.8)GC日志解析与分析
文章目录1.GC测试类2.GC日志解析(默认并行GC Parallel)2.1 1G heap内存的GC日志分析2.1.1 GC日志2.1.2 YGC日志解析2.1.3 FullGC日志解析2.2 512M heap内存的GC日志分析2.3 256M heap内存的GC日志分析2.4 128M heap内存的GC日志2.5 4G heap内存的GC日志3.串行GC(UseSerialGC)日志分析4. CMSGC(UseConcMarkSweepGC)日志分析5. G1GC(UseG1GC)日志分析1.G原创 2021-08-09 19:36:37 · 960 阅读 · 0 评论 -
一个求水仙花数的类的字节码分析
1.源码代码如下:package com.dhb.geektimestudy.kimmking.week1;public class Hello { private static final int min = 100; private static final int max = 1000; public static void main(String[] args) { Hello.findLotus(); } public void findLotus() {原创 2021-08-06 14:53:36 · 87 阅读 · 0 评论 -
java类的class文件字节码解析
文章目录1.java语言2.java字节码2.1 如何生成字节码如何生成字节码?2.2 字节码的构成2.2.1 魔数及版本信息2.2.2 常量池2.2.3 访问标识2.2.4 类索引、父类索引和接口索引集合2.2.5 字段表集合2.2.6 方法表集合2.2.6.1 方法一2.2.6.1 方法二2.2.7 属性集合表说明3.总结1.java语言编程语言的分类:分类方式说明核心思想面向过程、面向对象、面向函数类型静态类型、动态类型执行方式编译执行、解释执行虚拟原创 2021-08-04 17:54:56 · 2253 阅读 · 1 评论 -
java全角半角标点符号转换
早上发现某个群居然爆出一个bug,上游系统存储的客户简称是商务人员自己填的,这个字段支持用户录入各种字符。但是下游对接的其他系统,在将这个字段应用到系统中的时候,不能支持全角的标点符号,如果这个字段有全角标点符号,则系统会出错。看到这个问题,我首先觉得下游对接的系统也是奇葩,居然还不支持全角的字符串。但是一想到我们没办法强迫下游系统来改变他们的接口,而站在本系统的角度来考虑,未来下游系统还很多,毕竟客户的基本信息数据会应用到越来越多的系统中去。最好的方式就是我们将采集到的客户信息中的全角字符,都自动转为半原创 2021-07-27 17:02:02 · 1142 阅读 · 0 评论 -
对复杂if-else代码块的优化方案
1.1 问题提出对于很多码农而言,if-else可能是最高频的代码关键字,毕竟,这也比较符合人们二维思考问题的方式,试想大部分问题的答案都是只有两个维度,要么true,要么false,那么通过if-else的方式是再好不过了。当然,if-else固然好,但是在代码中过多的使用,或者反复的嵌套使用,那样就不好了。前几天看到了下面这张图,固然这张图比较夸张,但是也说明了,多重嵌套的if-else的不可取之处。今天本文就来聊聊,在java中,面对已经出现了的多重if-else嵌套的情况,我们应该怎么去优化原创 2021-01-22 15:39:42 · 557 阅读 · 1 评论 -
解决IDEA中采用gradle编译的控制台输出乱码问题
最近在学习netty的过程中,顺便将编译环境从maven换为了gradle,gradle的配置方式也是非常简单的,但是在实际使用的过程中,出现了乱码问题,就是控制台输出中文的时候,总会出现乱码。情况如下:我用JFrame写了一个netty的聊天室小程序。结果在后台采用system.out的时候,输出就变成了乱码:实际上在netty输出的过程中没有影响,我猜想可能idea的配置出现了问题。分别对idea的配置进行了检查:在File->Settings->Editor->File E原创 2021-01-11 11:39:34 · 1640 阅读 · 0 评论 -
多线程基础(二十一):StampedLock源码分析
1.类结构及其注释1.1 类结构StampedLock是在java8中引入的一个新的并发工具,主要为了解决此前java7中Lock实现上的一些问题,如ReentrantReadWriteLock的锁饥饿问题。StampedLock是一个全新的Lock,其内部通过ReadWriteLockView、ReadLockView、writeLockView这三个内部类分别实现了Lock和ReadWriteLock接口。而WNode节点,则是一个链表的数据结构,其目的在于实现StanpedLock的CLH锁。原创 2020-12-30 19:42:18 · 678 阅读 · 0 评论 -
多线程基础(二十):CyclicBarrier源码分析
CyclicBarrier是java并发包中的常用工具之一,通常被用来与CountDownlatch对比。CyclicBarrier能够实现CountDownLatch的效果,此外还能重复使用,而CountDownLatch则只能做一次计数。但是对于实现的源码而言,CyclicBarrier对于CountDowLatch有着本质的不同。CountDownLatch基于AQS的等待队列实现。而CyclicBarrier则依赖于ReentrantLock的Condition。我们前面在介绍AQS的时候知道,Co原创 2020-11-16 15:07:10 · 269 阅读 · 0 评论 -
java中基本类型boolean在jvm中的具体实现
在前面在java中boolean类型占多少字节?一文中,对java的基本数据类型,boolean进行过一些简单的分析。在该文中得出,java的boolean类型,实际上存储的时候是4Byte,boolean的操作与int无异。但是在boolean数组中,则每个boolean的长度为1Byte。最近在极客时间学习深入拆解Java虚拟机专栏的时候,也看到类似的问题,现在按照极客时间学习的思路,对boolean的使用进行验证。$ echo 'public class Foo { public static原创 2020-11-13 17:54:18 · 790 阅读 · 0 评论 -
多线程基础(十九):Semaphore源码分析
文章目录1.类结构及注释1.1 类结构1.2 注释部分2.内部类Sync2.1 nonfairTryAcquireShared2.2 tryReleaseShared2.3 reducePermits2.4 drainPermits3.NonfairSync与FairSync3.1 NonfairSync3.2 FairSync4.构造方法4.1 Semaphore(int permits)4.2 Semaphore(int permits, boolean fair)5.其他方法5.1 acquire5.原创 2020-11-12 17:38:41 · 367 阅读 · 0 评论