- 博客(23)
- 收藏
- 关注
原创 分布式事务处理方法
1分布式事务场景以电商项目为例,项目初始都是单体架构,比如现在需要下单时,需要做的是1创建订单2减库存3增加用户积分,当没有分库时,可以通过本地事务控制数据的一致性,但是以现在的微服务架构时,这3个操作是通过服务调用实现的,无法通过本地事务保证事务的一致性,比如1和2执行成功,3失败了,无法通过本地的transaction回滚,如果保证事务的一致性成为关键。目前有几种流行的做法:比如阿里的seata提供了几种方式,分别为tcc模式,AT模式,sagas模式,现在分别简单记录下原理。2seata的TCC模
2021-09-02 14:50:39
312
原创 mysql可重复读引发的问题
MySQL在可重复读的情况下,当一个线程去查询某条数据不存在在插入的情况下是不靠谱的,因为在开启事务到查询期间,有可能另一个线程已经插入了数据,而可重复读的情况下,单前事务是查询不到新插入的数据的,就会出现插入重复的情况,这时解决方法有:1数据库加唯一索引2在程序里使用分布式锁,程序拿到锁之后在执行查询,这时候的其他线程拿不到锁是不会插入的,所以这时候的查询时可靠的。3在事务的查询用select …for update...
2021-08-26 20:54:58
2211
原创 spring自动注入
一、问题描述今天在看mybatis源码的ClassPathMapperScanner扫描指定的包并生成代理对象的时候,发现再把beanClass替换成mapperFactoryBean的时候,并没有设置sqlSessionFactory的属性值,而生成的对象里却有了,但是类里也没有@autowired注解,只有一个setSqlSessionFactory()方法,但是也没发现调用的地方,但打个断点的时候发现确实是调用了,一直找不到原因,后来上网查了,才知道原因:里面有一行代码:definition.se
2021-02-25 18:49:55
497
1
原创 mybatis的MapperScan注解和MapperScannerConfigurer
一、MapperScan使用MapperScan注解里很详细的给出了MapperScan注解的使用方法;MapperScan极大简化了mybatis的使用成本,不用在每个Java接口里配置@Mapper接口,同时也不用在使用SqlSessionTemplate.getMapper(PersonDao.class)去获取代理对象了,而是直接可以通过在使用的地方通过@Autowired获取了,我们知道@Autowired,是从spring容器里获取对象,且获取到的对象肯定是代理对象,因为我们给出的是接口地
2021-02-23 21:23:34
3588
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
496
原创 mybatis线程安全
一、 mybatis实现方式mybatis提供了一个DefaultSqlSession,而它又是线程不安全的,所以使用的时候应该每次获取新的,我们看下mybatis如何使用:mybatis的SqlSessionFactory提供的默认实现为DefaultSqlSessionFactory,而我们每次使用时,是SqlSession sqlSession = sqlSessionFactory.openSession();DefaultSqlSessionFactory.java@Override
2021-02-10 22:40:29
1634
原创 mybatis初始化
一、mybatis使用方式mybatis使用需要创建SqlSessionFactory,创建方式有两种:通过mybatis自己提供的SqlSessionFactoryBuilder创建:1.1通过代码创建,不需要配置xmlpublic SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
2021-02-10 18:34:46
394
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
454
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
2291
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
591
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
491
原创 spring的metadata
spring的metadataspring的元数据都继承注解元数据接口AnnotatedTypeMetadata ,因为方法,类和注解里可能都包含注解,所以都要获取注解信息;除了获取注解信息外,各类型元注解都加了各自本身的信息;如类添加了类名称,获取父类,实现的接口等;public interface AnnotatedTypeMetadata { boolean isAnnotated(String var1); @Nullable Map<String, Objec
2020-12-24 11:26:38
1396
原创 Java动态代理
动态代理原理为了实现在某各类方法调用的前后做一些事情(输出日志等),同时又不用在改变类的代码,还可以统一操作一批类。Java动态代理原理就是动态的生成字节码技术,Java Class其实就是二进制文件,我们可以利用classloader动态加载这个二进制文件,然后生成Java对象,生成原理就是生成Java的各个部分如Java魔数,版本号,各个字段,Java虚方法,构造方法和其他方法。Jav...
2020-12-21 21:14:48
274
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
778
原创 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
1191
原创 spring mvc dispatcherServlet
1结构dispatcherServlet继承FrameworkServlet,内部持有WebApplicationContext,所以具体Spring容器的功能public DispatcherServlet(WebApplicationContext webApplicationContext) { super(webApplicationContext); this.setDispatchOptionsRequest(true); }持有HandlerMa
2020-05-25 18:35:18
179
原创 java的栈帧
获取栈帧StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); stacks[0].getMethodName(); stacks[0].getClassName();StackTraceElement其实就是Java线程转储之后的栈帧,可以通过栈帧获取方法名称等。Java打...
2019-06-20 11:27:14
1553
原创 普通hash和一致性hash的区别
普通hash定义Hash函数:一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。碰撞(冲突):如果两个关键字通过hash函数得到的值是一样的,就是碰撞或冲突。Hash表(散列表):根据散列函数和冲突处理将一组关键字分配在连续的地址空间内,并以散列值记录在表中的存储位置,这种表成为散列表。常用...
2019-05-10 15:42:48
3692
原创 如何保证线程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
158
原创 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
2799
原创 mybaties使用过程及原理
mybaties使用过程及原理1加载xml配置,读取bean文件,dataSource和mapper文件的位置,并返回factory对象。SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(new FileInputStream(“conf/configeration.xml”));xml如下:&lt;?xml ...
2018-10-17 16:53:39
795
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
87
原创 mysql中关于null的问题
mysql中的null值不能参与任何比较的运算,返回的结果都是null,如果用not in(20,30 ,null)这种情况不会返回数据;关于order by时,认为null值是最小的,无论数值或字符串asc排序时,null值都会排在最前面。...
2018-08-02 11:20:01
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人