Spring中有两个id相同的bean会报错吗
首先,在同一个xml配置文件里面不能出现两个id相同的bean,否则在spring容器启动时会报错,因为id属性表示bean里面的唯一标识符号,所以spring在启动的时候会去验证一下这个id的唯一性,一旦重复就会报错,这个错误发生在spring对xml文件进行解析转化为BeanDefinition的一个阶段。
但是在两个不同的spring配置文件里面,可以存在两个id相同的两个bean,ioc在容器在加载bean的时候默认会把多个相同id的bean进行覆盖。在spring3.x版本提供了一个@Configure这个注解去声明一个配置类。然后使用@Bean这个注解去实现Bean的声明,那么这个方式完全取代了xml的一个配置形式。在这种情况下,如果在同一个配置类里面去声明多个相同名字的Bean,那么spring
ioc容器在解析的时候只会注册第一个声明Bean的一个实例。后面重复名字的Bean实例就不会再注册了
再spring ioc容器中只会保存userService01这个实例,后面相同名字的实例不会再被加载
如何使用@Autowired注解去根据类型进行实例注入的时候,spring ioc容器中只会存在userService01这个实例,所以再启动的时候会报错说找不到userService02这个实例
如何使用@Resource注解去根据名字进行依赖注入的时候,根据名字spring ioc容器中只会存在userService01这个实例对象,于是spring把userService01这个实例赋值给userService02的时候会提示一个类型不匹配的错误,这个错误是在spring ioc容器里面的bean初始化之后依赖注入阶段去发生的。
Redis哨兵集群和redis cluster集群的区别
1.redis哨兵集群是基于主从复制来实现的 可以实现读写分离 分担redis读操作的压力
redis cluster集群里面的slaver节点只是实现一个冷备的机制 只有在master宕机之后才会工作
redis哨兵集群是基于主从复制来实现的
2.redis哨兵集群无法在线扩容,所以其并发压力受限于单个服务器资源的一个配置
redis cluster提供了一个基于slot槽的一个数据分片的机制,可以实现在线扩容,提升读写的性能
3.从集群的架构来说
redis哨兵集群是一主多从 redis cluster是多主多从的一个机制
主从节点(没有容灾能力 不会自动选举)or redis cluster集群
redis提供了哨兵机制专门用来监听redis主从集群提供故障的自动恢复能力,其中哨兵会监视redis主从节点的一个状态,能解决选举的问题,但是在线扩容的问题还是不能解决
于是redis cluster实现了redis的分布式存储 即每个节点存储不同的数据实现数据的分片功能 主要是引入slot槽来进行数据分片 slot取值范围0-16383 每个节点会分配一个slot区间,存储的时候会根据key去得到一个slot值 然后找到对应的节点进行数据的读写 会自动进行选举
如何解决innodb的幻读问题
innodb引入了间隙锁和next-key机制去解决幻读问题
for update进行加锁的时候 会产生一个叫记录锁 也就是行锁 锁定id=1这个索引 被锁定的记录在锁释放之前 其他事务是无法对这一条记录做任何操作的
innodb要解决幻读的问题就必须保证如果一个事务进行下图所示的查询语句进行锁定的时候另外一个事务再执行一条这样的insert语句需要被阻塞,直到前面获得锁的事务被释放
所以在innodb中设计了间隙锁 作用是锁定一段范围内的索引记录
对查询范围id>4and id<7这个范围加锁的时候会针对B+树中4-7的这个开区间的范围加间隙锁
意味着其他事务对这个区间中的数据进行更新、插入。删除都会被锁定 但是还有另外一种情况
eg
针对id>4这个条件加锁 需要锁定多个索引区间 在这个情况下innodb引入了next-key lock机制
next-key lock机制相当于间隙锁+记录锁 记录锁锁定存在记录的行 间隙锁锁住的是记录行之间的间隙 next-key锁住的是两者的和
next-key lock会锁住多个索引区间 包含记录锁和间隙锁
每个数据行上的非唯一索引列都会存在一把next-key lock 当某个事务持有这一行数据的next-key lock的时候会锁住一段在左开右闭区间的数据
因此在进行id>4加锁的时候innodb会去加一个next-key lock锁锁定的区间范围是(4,7】,(7,10】(10,+∞】
当使用范围查询不仅仅名字record记录,还包含了gap间隙的时候 使用的就是next-key lock 它是mysql默认的行锁算法
1.mysql的事务隔离级别
幻读:就是在同一个事务中前后两次查询相同范围的时候得到的结果不一致的
强调的是范围查询
RC就不会存在间隙锁 对性能影响就不会这么大
线程两次调用start(),会出现什么文题
在一个线程中只能调用一次start()方法第二次调用会抛出ilegalthreadstateexecption
一个线程本身是具备一个生命周期的 包含六种状态。。。。
当我们第一次调用strat()方法的时候线程状态可能还会处于中止状态或者说非NEW状态下的一个其他状态,再调用一次start()方法的时候相当于让这个运行中的线程再重新运行一遍,不管是从线程的安全性角度来看还是从线程本身的执行逻辑来看都是不合理 为了避免这个问题 再线程运行的时候会先判断线程的一个运行状态。