- 博客(16)
- 收藏
- 关注
原创 springboot + druid-spring-boot-starter + mysql 实现动态多数据源
*** 多数据源注解,可以在方法和类添加该注解*/// 数据源类型@Override// 公共key// 加密密码// 解密密码// 设置密码// 加密// 解密try{LOGGER.info("解密失败!{}",e);
2024-10-07 17:01:11
1044
原创 Orecle 迁移 人大金仓数据库 SQL 问题
使用 oracle 项目一般使用,start with ... connect by 语法做菜单栏数据查询,该语法在人大金仓数据库提供的可视化工具中可以执行,但在Springboot + mybatis 项目中无法执行(版本2.X),通过与人大金仓人员交涉,可以使用 with recursive.... as(... union ..) select ... where... 语法替代,该语法基础是如下: 假设有如下一张表(menu_table): 我们可以使用一下 SQL查询出树状数
2024-10-06 11:35:25
1225
2
原创 Oracle PL/SQL 基础知识
- 业务执行逻辑 ,dbms_output.put_line('holle!ELSEIF i == 1 THEN dbms_output.put_line('当前 i 等于 1!IF i == 0 THEN dbms_output.put_line('当前 i 等于 0!v_name varchar2(20) -- 声明 varchar2(20) 类型变量 v_name。dbms_output.put_line('i') -- 打印 i 信息。v_name := '小明';
2024-08-07 15:42:20
391
原创 MQ(Rabbit MQ)基础知识
普通集群:多个服务共享 交换机、队列等元信息,但是不共享队列中存储的数据,而是其它服务保存指向存有真实数据队列的地址, 在保存或访问数据,访问节点中没有真实数据,会将信息转发到有真是信息的节点保存或获取数据,如果真实保存数据的节点宕机了,就无法保存获取数据了。消息消费者怎么知道去那个队列拿信息?死信队列:消息提供者在发布消息时设置消息存活时间,在存活时间内没有消费者消费该信息,则该信息为死信,如果当前队列没有绑定死信交换机该消息会被抛弃,绑定有死信交换机,该信息会被存放到死信队列中,被死信队列消费者消费。
2024-03-16 16:31:04
1840
1
原创 分布式系统常见问题
事务管理者(TM)开启全局事务,然后调用分支事务(RM)向分布式事务协调者(TC)注册分支事务信息,分支事务执行完 SQL 语句后不提交事务,先向事务协调者报告当前事务的状态,事务协调者检查所有分支事务状态,如果都没有问题事务协调者通知所有分支事务提交数据结束全局事务,如果有一个分支事务状态异常,事务协调者通知所有分支事务回滚数据, XA 方案要求数据强一致性是 CP 架构。RM 分支事务资源管理者:管理分支事务与事务协调者交互,注册分支事务、提交分支事务状态、提交与回滚分支事务。
2024-03-14 18:18:50
2044
1
原创 Spring Cloud 基础知识
服务熔断:需要在启动类加上 EnableCircuitBreaker 注解,针对整个服务如果大量请求处理会开启服务熔断,一段时间内不会再调用异常服务,等一段时间后再尝试调用异常服务,如果可以正常调用关闭服务熔断,不能正常服务继熔断。Hystrix 组件主要做服务保护,如果在服务的调用链路中有一个服务出现故障,可能导致调用该服务的其它服务功能不可用,如果有大量服务异常出现服务雪崩问题,可以使用 Hystrix 做服务降级或者服务熔断。Euraka 注册中心主要提供 服务注册、服务发现、服务心跳检测等功能,
2024-03-13 17:58:05
566
原创 Spring 框架基础知识
spring 框架中的 bean 默认是单例,如果当前 bean 是一个无状态对象是线程安全,如果当前 bean 不是无状态对象不是线程安全的,可以根据当前对象中是否有共享属性,判断当前对象是否为无状态对象,无共享属性为无状态对象,如果不是无状态对象可以使用 Scope 注解,设置为 多例 或者 使用锁 解决线程安全问题。2. 同一个类中,一个为加事务注解的方法中调用添加事务注解的方法,导致事务注解失效,因为同一个类两个方法互相调用不走代理类,无法开启事务。
2024-03-13 13:17:55
785
原创 Redis 集群基础知识
分片集群虽然解决了海量数据读写问题,也引出了新的问题,比如再写数据时发现某个主节点故障,导致某一个区间的数据无法保存,这时需要一个监控机制 帮助集群故障恢复,目前主流解决方案,让每个主节点相互监测,当多个主节点发现某个主节点,在一段时间内没有发送心跳信息就将其标注为故障,如果有一半以上的主节点将其标注,客观认为该主机点已经故障,便从故障主从集群中投票选举一个从节点作为新的主节点,同时通知其它机器新主节点的信息。1. 从节点向主节点发送同步数据请求,并发送主节点的 run id 和 offset 信息。
2024-03-12 15:09:39
554
1
原创 Redis 基础知识:
rdb 方式:当执行 save 或者 bgsave 指令时,redis 会记录当前时刻内存缓存的数据快照并将数据写入到文件后缀为 rdb 的文件中,如果使用的是 save 指令持久化数据会导致阻塞,因为它使用 redis 主线程做数据持久化,如果使用 bgsave 指令持久化数据会开启子线程,由子线程做数据持久化,当子线程持久化数据时,主线程会复制一份完成的数据,后续主线程处理新的请求修改缓存数据,但是只修改新副本中的数据,aof 保存指令信息持久化数据,文件体积大,服务宕机数据恢复慢,数据完整度高。
2024-03-11 18:06:31
835
原创 Mybatis 基础知识
mybatis 二级缓存是 namespace 命名空间缓存,需要手动开启在配置文件中添加 Cache Enable 信息并且在 Mapper 文件中添加缓存标签<Cache /> 才会开启,二级缓存也是本地缓存,如果在同一个 namespace 命名空间先执行相同的 sql 语句,第一次会去数据库中查询数据,后续几次直接获取本地缓存数据,但是在同一个 namespace 命名空间下做过一次 增删改操作,会清空当前命名空间下的所有缓存信息。
2024-03-10 17:39:42
367
1
原创 MySQL 基础知识
在介绍 undo log 与 redo log 前先介绍一下 缓存池(buffer pool、数据页 (data page)缓存池:在执行语句时,会先去寻找当前要操作的数据是否在缓存池中,如果缓存池中没有,先将磁盘中的数据加载到缓存池中,然后在操作缓存池中的数据数据页: innodb 存储引擎在磁盘中管理数据最小单位,数据一行一行的保存在数据页中。
2024-03-08 23:35:35
664
1
原创 Java 集合基础知识
4. 先判断当前下标中是否存在数据 ,存在数据且两个数据 key 不相同,判断当前数组中对象类型是否属于红黑树节点类型,如果是红黑树节点类型,根据 hash 值查找红黑树中是否有存在 key 相同的节点并覆盖旧数据,没有key相同的接口创建一个新的节点添加到红黑树中,如果不是红黑树节点类型,遍历链表比较 key 数据,找到 key 相同节点覆盖旧数据,否则创建一个新的节点放到链表中。4.2 用最小容量与当前数组最大容量比较,如果大于当前数据容量,依挡墙容量的1.5倍进行扩容并进行数组拷贝。
2024-03-05 21:43:44
1419
原创 线程 ThreadLocal 对象
如果当前线程没有 ThreadLocalMap 对象(当前线程ThreadLocalMap 对应的属性值为null),会创建一个 ThreadLocalMap 对象并将ThreadLocal 对象与要存储的数据当作Key 和 Value 放入Entity 对象,然后在存放进Entity数组中,以ThreadLocal对象计算出数据在数组中下标。set 方法:存数据前先获取当前线程对象,然后用线程对象获取 ThreadLocalMap 对象,补充:java 对象的四种引用类型:强、软、弱、虚。
2024-03-04 17:27:35
365
1
原创 线程池基础知识
新的任务进来时会先判断核心线程是否空闲,如果空闲直接处理任务,不空闲判断一下工作队列是否装满,没有装满将新的任务添加到工作队列中,如果工作队列已经满了,判断是否有临时线程,有临时线程让临时线程处理任务,没有临时线程走拒绝策略。创建线程需要一定的内存空间,无限的创建线程非常浪费内存资源且CPU 一次只能处理一个线程任务,大量的线程挂起唤醒线程之间的切换会导致性能变差,所以一般使用线程池管理线程。3.newSingleThreadPool() 单线程池,线程池只有一个线程,核心线程数与最大线程数都是1。
2024-03-04 12:25:33
719
1
原创 线程并发安全
AQS (AbstractQueuedSynchronized) 是抽象队列同步器,它是构建锁的基础框架,常见的 ReentrantLock 锁、CountDownLatch 计数器都以AQS为基础框架,AQS 架构中有一个 Volatle 修饰的变量 state 用于记录锁的状态,如果有线程修改 state 值为 1,成功获取到所资源,其它线程尝试修改失败,会等待并存放到队列中等待锁的释放。AQS 与 Synchronized 比较。
2024-03-03 20:23:20
712
原创 Java 线程基础知识
新建一个线程对象在还没有调用 start 方法之前为新建状态,调用 start 方法之后该线程处于可运行阶段,如果没有抢到 CPU 执行权该线程为 就绪状态 ,抢到CPU 执行权为运行状态,在运行的过程中调用 wait 方法会导致线程等待(没有抢到锁资源会阻塞),任务执行完线程终止。调用 start 的方法是开启一个线程,该线程只用调用一次start方法,多次调用会报错,调用 run/call 方法不会开启线程就是执行一个普通的方法,可以多次调用。notify 随机唤醒一个等待线程。
2024-03-02 23:23:20
400
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人