自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 分布式事务处理方法

1分布式事务场景以电商项目为例,项目初始都是单体架构,比如现在需要下单时,需要做的是1创建订单2减库存3增加用户积分,当没有分库时,可以通过本地事务控制数据的一致性,但是以现在的微服务架构时,这3个操作是通过服务调用实现的,无法通过本地事务保证事务的一致性,比如1和2执行成功,3失败了,无法通过本地的transaction回滚,如果保证事务的一致性成为关键。目前有几种流行的做法:比如阿里的seata提供了几种方式,分别为tcc模式,AT模式,sagas模式,现在分别简单记录下原理。2seata的TCC模

2021-09-02 14:50:39 285

原创 mysql可重复读引发的问题

MySQL在可重复读的情况下,当一个线程去查询某条数据不存在在插入的情况下是不靠谱的,因为在开启事务到查询期间,有可能另一个线程已经插入了数据,而可重复读的情况下,单前事务是查询不到新插入的数据的,就会出现插入重复的情况,这时解决方法有:1数据库加唯一索引2在程序里使用分布式锁,程序拿到锁之后在执行查询,这时候的其他线程拿不到锁是不会插入的,所以这时候的查询时可靠的。3在事务的查询用select …for update...

2021-08-26 20:54:58 2110

原创 spring自动注入

一、问题描述今天在看mybatis源码的ClassPathMapperScanner扫描指定的包并生成代理对象的时候,发现再把beanClass替换成mapperFactoryBean的时候,并没有设置sqlSessionFactory的属性值,而生成的对象里却有了,但是类里也没有@autowired注解,只有一个setSqlSessionFactory()方法,但是也没发现调用的地方,但打个断点的时候发现确实是调用了,一直找不到原因,后来上网查了,才知道原因:里面有一行代码:definition.se

2021-02-25 18:49:55 461 1

原创 mybatis的MapperScan注解和MapperScannerConfigurer

一、MapperScan使用MapperScan注解里很详细的给出了MapperScan注解的使用方法;MapperScan极大简化了mybatis的使用成本,不用在每个Java接口里配置@Mapper接口,同时也不用在使用SqlSessionTemplate.getMapper(PersonDao.class)去获取代理对象了,而是直接可以通过在使用的地方通过@Autowired获取了,我们知道@Autowired,是从spring容器里获取对象,且获取到的对象肯定是代理对象,因为我们给出的是接口地

2021-02-23 21:23:34 3331 1

原创 spring加载资源文件

一、Java读取文件Java读取文件比较繁琐:File类只能通过绝对路径读取文件;File file = new File("D:\\ideaworkspace\\spring-advisor\\target\\classes/p.properties"); System.out.println(file.exists()); FileInputStream fileInputStream = new FileInputStream("D:\\ideaworkspace\

2021-02-11 00:08:03 461

原创 mybatis线程安全

一、 mybatis实现方式mybatis提供了一个DefaultSqlSession,而它又是线程不安全的,所以使用的时候应该每次获取新的,我们看下mybatis如何使用:mybatis的SqlSessionFactory提供的默认实现为DefaultSqlSessionFactory,而我们每次使用时,是SqlSession sqlSession = sqlSessionFactory.openSession();DefaultSqlSessionFactory.java@Override

2021-02-10 22:40:29 1541

原创 mybatis初始化

一、mybatis使用方式mybatis使用需要创建SqlSessionFactory,创建方式有两种:通过mybatis自己提供的SqlSessionFactoryBuilder创建:1.1通过代码创建,不需要配置xmlpublic SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

2021-02-10 18:34:46 360 2

原创 spring容器启动过程(三)实例化单例bean

前两篇介绍了spring解析xml的过程,和spring处理@Component注解生成beanDefine,这篇介绍用beanDefine生成bean实例;public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { this.prepareRefresh(); //比较重要,获

2021-01-29 12:08:32 418 2

原创 spring集成log4j

一、集成方式1在pom里加入依赖<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>2在resources文件夹下加入log4j.properties文件# +=======

2021-01-27 21:05:30 2216 2

原创 java的SPI与JDBC

一、Java的SPIJava提供了spi机制,在class path下建立MATE-INFO/services/com.xiaolong.Person文件,里面写上实现类:com.xialong.Studentpublic static void main(String[] args) { ServiceLoader<Person> serviceLoader = ServiceLoader.load(Person.class); Iterator<

2021-01-15 00:27:50 553 1

原创 spring容器启动过程(二)扫描并解析@ComponentScan注解

一、处理@ComponentScan注解上篇介绍了spring解析xml的过程,这篇来介绍下spring处理@Component注解生成beanDefinepublic void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { this.prepareRefresh(); //比较重要,获

2020-12-26 22:46:55 423

原创 spring的metadata

spring的metadataspring的元数据都继承注解元数据接口AnnotatedTypeMetadata ,因为方法,类和注解里可能都包含注解,所以都要获取注解信息;除了获取注解信息外,各类型元注解都加了各自本身的信息;如类添加了类名称,获取父类,实现的接口等;public interface AnnotatedTypeMetadata { boolean isAnnotated(String var1); @Nullable Map<String, Objec

2020-12-24 11:26:38 1361

原创 Java动态代理

动态代理原理为了实现在某各类方法调用的前后做一些事情(输出日志等),同时又不用在改变类的代码,还可以统一操作一批类。Java动态代理原理就是动态的生成字节码技术,Java Class其实就是二进制文件,我们可以利用classloader动态加载这个二进制文件,然后生成Java对象,生成原理就是生成Java的各个部分如Java魔数,版本号,各个字段,Java虚方法,构造方法和其他方法。Jav...

2020-12-21 21:14:48 244 1

原创 spring容器启动过程(一)扫描并解析xml

一、通过配置类构造Spring容器public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); this.register(componentClasses); this.refresh(); }1、this()方法构造了两个工具,reader负责注册Spring配置类,scanner负责扫描后面配置类的路径下的Java类publi

2020-11-17 20:04:42 744

原创 es存储过程

es结构es的一个index包含多个shared分片每个分片包含多个segment每个segment包含一个倒排序列表倒排序列表结构分词文档idhello2es存储文档过程当客户端saveIndex()之后,数据首先被放到Java的内存,然后过1s后会执行refresh操作,把内存的数据创建segment,并生成translog,segment也是放在缓存中,并提供查询功能,这是数据并没有写入磁盘,所以es会定期执行flush操作,将缓存中的segment利用tr

2020-11-11 11:26:43 1149

原创 spring mvc dispatcherServlet

1结构dispatcherServlet继承FrameworkServlet,内部持有WebApplicationContext,所以具体Spring容器的功能public DispatcherServlet(WebApplicationContext webApplicationContext) { super(webApplicationContext); this.setDispatchOptionsRequest(true); }持有HandlerMa

2020-05-25 18:35:18 152

原创 java的栈帧

获取栈帧StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); stacks[0].getMethodName(); stacks[0].getClassName();StackTraceElement其实就是Java线程转储之后的栈帧,可以通过栈帧获取方法名称等。Java打...

2019-06-20 11:27:14 1516

原创 普通hash和一致性hash的区别

普通hash定义Hash函数:一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。碰撞(冲突):如果两个关键字通过hash函数得到的值是一样的,就是碰撞或冲突。Hash表(散列表):根据散列函数和冲突处理将一组关键字分配在连续的地址空间内,并以散列值记录在表中的存储位置,这种表成为散列表。常用...

2019-05-10 15:42:48 3610

原创 如何保证线程T1在T2后面执行

1在T2线程里执行T1.join()2设置T2线程的优先级高于T13使用java的concurrent包里面的CountDownLatch;CountDownLatch latch = new CountDownLatch(1);在T1里执行latch.countDown();在T2里执行latch.await();...

2019-01-28 16:50:16 140

原创 linux配置环境变量

1 解压 $ tar zxvf jdk-8u111-linux-x64.tar.gz2配置环境变量:打开控制台,运行$ sudo vi /etc/profile,在最后插入要配置的内容 ,按Esc键 ,输入( :wq 保存并退出) export JAVA_HOME=/home/ubuntu/software/java/jdk1.8.0_191 export PATH=$JAVA_H...

2018-10-23 17:59:43 2766

原创 mybaties使用过程及原理

mybaties使用过程及原理1加载xml配置,读取bean文件,dataSource和mapper文件的位置,并返回factory对象。SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(new FileInputStream(“conf/configeration.xml”));xml如下:&amp;lt;?xml ...

2018-10-17 16:53:39 774 1

转载 git使用

一.创建版本库①初始化一个Git仓库:git init②添加文件到Git仓库:1.git add ; 2.git commit二.时光机穿梭①查看工作区状态,文件是否被修改过:git status②查看修改的内容:git diff1.版本回退①HEAD:当前版本②HEAD^:上个版本③定位版本:git reset –hard commit_id④git l...

2018-08-05 16:41:00 79

原创 mysql中关于null的问题

mysql中的null值不能参与任何比较的运算,返回的结果都是null,如果用not in(20,30 ,null)这种情况不会返回数据;关于order by时,认为null值是最小的,无论数值或字符串asc排序时,null值都会排在最前面。...

2018-08-02 11:20:01 265

空空如也

空空如也

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

TA关注的人

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