- 博客(93)
- 收藏
- 关注
原创 瀚高(PG)数据库无法修改数据——锁表
应用程序a获取表1的第一行的锁来进行更新,然后同时程序B获得表第2的第2行的锁。现在,应用A需要锁定表2第2行来继续执行并完成,但是它无法获取锁,这是因为该锁现在由应用程序B保持。如果将此操作拆分为多个命令,例如添加列,添加默认值,更新空值,将最小化锁的影响。2)有时不可能实际拆分事务,因此工作应该集中于每次都尽量以一致的顺序执行操作,这样事务就能形成格式良好的队列并且不会发生死锁。而且,如果应用程序B需要锁定表1第1行,来继续执行并完成事务,它也无法获取锁,因为该锁由应用程序A持有。
2024-01-30 10:53:01
826
原创 遇见sql语句拼装报错 sql injection violation, syntax error: syntax error, expect RPAREN
在使用PostgreSql瀚高数据库时,相同的语句 select * from public.files_info fi where fi.file_size notnull 在DBever能执行,但是在spring中报错。在spring中JPA版本问题导致,不支持这种写法,会识别为sql注入风险,应该为is not null ,类似isnull 也必须改为 is null。
2023-12-28 20:05:45
1165
1
原创 idea的maven报错Unable to import maven project: See logs for details
碰见Unable to import maven project: See logs for details或者Unable to reload maven project: See logs for details 别改了,赶紧看看idea和maven版本兼容不兼容,要哭了0.IDEA 2022 兼容maven 3.8.1及之前的所用版本1.IDEA 2021 兼容maven 3.8.1及之前的所用版本2.IDEA 2020 兼容Maven 3.6.3及之前所有版本3.IDEA 2018 兼容Maven3
2022-06-20 20:24:54
576
原创 消息队列(MQ)简介
从字面理解,本质就是队列,FIFO先入先出,只不过队列中存放的是Message而已,是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是常见的上下游“逻辑解耦+物理解耦”的消息通信服务,在使用MQ之后,消息发送上只需要依赖MQ,不用依赖其他服务。比如说,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时是没有问题的,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用MQ做缓冲,我们可以取消这个限制,
2022-06-04 22:06:48
5397
1
原创 MySQL行锁
行锁:行锁也称为记录锁,顾名思义,就是锁住某一行(某条记录row)。需要的注意的事,MySQL服务器层并没有实行行锁机制,行级锁只在储存引擎实现。优点:锁的力度小,发生锁冲突概率低,可以实现高并发。缺点:对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。InnoDB与MySAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。...
2022-04-30 23:56:29
5757
原创 MySQL的表锁
共享锁与排它锁(读锁和写锁)读锁(共享锁):针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,互相不阻塞写锁(排它锁):当前写操作没有完成前,他会阻断其他的写锁和读锁。这样就保证了在一定时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的统一资源对于innoDB来说,读锁可以加在表上,也可以加在行上。(行级读写锁)如果一个事务T1已经获得了某行R的读锁,那么此时另一个的事务T2是可以去获得这个行R的读锁的,因为读取的操作并没有改变行而的数据;但是,如果某个事务T3想获得行R
2022-04-29 14:26:57
8778
1
原创 redolog 、undolog 和binlog
首先提及一下事务的ACID :原子性、一致性、隔离性和持久性隔离性:是由 锁实现的原子性、一致性、和持久性 是由 redo log 和undo log
2022-04-25 15:41:58
6278
1
原创 Spring源码仿写pro
宝子们,在前面写过一片简单的springIOC仿写,感觉太简单了,只是简单的理解过程,现在基于源码又写一份源码,Atuowire ,Componen,Scope 等等注解均进行了实现,单例多例的实现,依赖注入,初始化方法,AOP的proxy动态代理,Cjlib代理正在实现,更新完成我会立马上传,每一步都有详细的注释欢迎来踩,附源码Zth的源码库截图代码部分源码 public Object getBean(String beanName) { BeanDefinition .
2022-04-23 11:00:00
242
原创 集合类的线程安全
不安全举例以LinkedList为例,运行一下代码public static void main(String[] args) { List<String> list = new LinkedList<>(); for (int i = 0; i < 10; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString
2022-04-17 17:39:27
345
原创 从源码看线程池
一、Java构建线程的方式1、继承Thread2、实现Runable3、实现Callable4、 线程池方式(java提供了构建线程池的方式)java提供了Executors可以去创建(在阿里规范中不能使用这种方式,因为这种方式对线程的控制力度比较低)手动创建线程池二、基本参数public ThreadPoolExecutor(int corePoolSize,\\核心线程数量 int maximumPoolSiz
2022-04-14 14:18:48
702
原创 MySQL索引类型
定义:帮助MySQL高效获取数据的数据结构索引方式:hash散列法时间复杂度O(1)哈希算法(也叫散列)、就是任意长度值(Key)通过散列算法变换成固定长度的Key地址,通过这个地址进行访问的数据结构。他通过把关键值映射到表中一个位置来访问记录,以加快查找速度。mysql默认索引就是hash的方式这个映射函数就是我们说的散列函数,存放记录的数组叫做散列表。通过hash会将(id)计算出一个hash值,然后通过这个值就能得到对应的数据缺点:1、不支持..
2022-04-10 19:54:55
1409
原创 数据库引擎MyISAM和InnDB
目录MyISAM引擎(非聚集索引方式)非聚簇索引:1、利用主键 id为主键索引时2、不以主键id为索引的时候INNODB引擎(聚集索引方式)聚簇索引:1、利用主键 id为主键索引时2、不以主键id为索引的时候存储对比引擎是基于表的而不是数据库MyISAM引擎(非聚集索引方式)MylSAM是MySQL的默认数据库引擎( 5.5版之前) ,由早期的ISAM ( Indexed Sequential Access Method :有索引的顺序访问方法)所改良。.
2022-04-10 19:30:28
897
原创 MyBatis-原理
目录1、获取sqlSessionFactory对象:2、获取sqlSession对象3、获取接口的代理对象(MapperProxy)4、执行增删改查方法总结: 1、根据配置文件(全局,sql映射)初始化出Configuration对象 2、创建一个DefaultSqlSession对象, 3、DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy; 4、MapperProxy里面有(DefaultS...
2022-04-10 11:25:09
164
原创 MyBatis的缓存机制
缓存机制提高运行速度,提高查询效率MyBatis包含--个非常强大的查询缓存特性它可以非常方便地配置和定制。缓存可以极大的提升查询效率。mybatis中默认二级缓存假如有一条数据的查询量非常大,且内容基本不变,那么反复查询就会让数据库压力变大,这时我们就可以将数据存在内存缓存中,这样就大大提高的了查询效率,同时缓解了数据库压力。一级缓存(本地)和二级缓存(全局)1、默认情况下,只有一级缓存( SqlSession级别的缓存也称为本地缓存)开启。2、二级缓存需要手动开启和配置,..
2022-04-09 23:44:01
3552
3
原创 Spring———AOP详解
什么是AOP?在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。以登录功能为例假如说现在给登录功能加上权限校验,如果之前的方式实现,就.
2022-04-08 17:30:57
648
原创 IOC与Bean
目录1、Bean管理(两个操作)2、Bean管理操作基于xml形式操作创建对象注入属性工厂BeanBean的作用域singleton和prototype区别bean自动装配1、根据属性名称自动注入(autowire="byName")2、根据属性名称自动注入(autowire="byType")外部属性文件1、直接配置数据库信息2、引入外部属性文件配置数据库连接池1、Bean管理(两个操作)(1)spring创建对象就是创建对象完成后交给.
2022-04-07 23:11:14
1127
原创 Bean的生命周期
目录1、生命周期2、bean的生命周期1、生命周期就是从对象创建到对象销毁的过程2、bean的生命周期(1)通过构造器创建bean的实例(无参数构造)(2)为bean的属性设置值和对其他bean引用(调用set方法)(2.5)把bean实例传递给bean的后置处理器方法(3)调用bean的初始化方法(需进行配置初始化的方法)(3.5)把bean实例传递给bean的后置处理器方法(4)bean可以进行使用(5)当容器关闭的...
2022-04-07 21:41:57
354
原创 SpringIOC过程
一、什么是IOC1、控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理2、使用IOC目的:为了耦合度降低二、IOC底层原理(主要是依靠xml解析、工厂模式还有反射三、
2022-04-07 16:28:33
692
原创 HTTPS加密通信过程原理
首先使用HTTPS协议会有80端口使用443端口SSL:安全套阶层,于1994年由网景公司设计,1995发布3.0版本TLS:传输层安全性协议,是IETF在SSL的基础上设计的协议(也就是HTTPS后边的S)从网络层协议理解HTTPS层级基本不变,只不是在HTTP的基础上加上TLS用来保证安全HTTP:超文本传输协议HTTPS:超文本传输安全协议TLS:位于HTTP和TCP之间的协议,其内部有TLS握手协议,TLS记录协议HTTPS是由HTTP进行通信,利用TLS保证
2022-04-05 18:51:34
5997
原创 面试。从输入URL到浏览器显示(详解)
目录一、首先会根据输入的url判断缓存信息二、解析DNS(详细过程)三、建立连接也就是(TCP三次握手)四、建立后,开始发起HTTP请求五、相应HTML,关闭TCP连接(四次挥手)六、解析HTML文件,七、开始渲染,呈现在浏览器一、首先会根据输入的url判断缓存信息强缓存(Cache-Control和Expires),此处主要是判断强缓存简介:直接从本地副本比对读取,不去请求服务器,返回的状态码是 200。协商缓存(last-modified 和 etag).
2022-04-05 11:40:51
1229
原创 HashMap源码仿写详解
今天没有研究技术,所以想着仿写一遍简单的hashmap源码,仅供参考,实现方法有很多我采用的尾插发,并实现了自动扩容,红黑树太复杂了,你可以看成是jdk1.7的简化hashmap,实现了指定table长度构造,put ,contains,扩容,getimport java.util.Arrays;import java.util.HashMap;/** * \* Created with IntelliJ IDEA. * \* @author: zth * \* Date: 2
2022-04-04 15:57:37
730
原创 Redis分布式锁
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问, 这就是分布式锁要解决的问题!分布式锁的主流方案:1、基于数据库实现分布式锁2、基于缓存(Redis等)(性能最高)3、基于Zookeeper(最可靠)基于redis实现1、通过setnx上锁,通过del解锁。(se
2022-04-03 23:25:09
1258
原创 MYSQL事务隔离级别
目录什么是事务?事务的特性(ACID)并发事务带来的问题事务隔离级别实际情况演示什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务的特性(ACID) 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的; 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数
2022-04-03 20:52:39
250
原创 redis——缓存穿透、击穿、雪崩
缓存穿透key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id 获取用户信息,不论缓存还是数据库都没有, 若黑客利用此漏洞进行攻击可能压垮数据库。特点1、应用服务器压力突然变大也就是服务器的请求变多,导致压力变大然后,开始请求redis2、redis命中率降低大量请求redis,如果有大量查出不到的结果的,就会导致redis缓存命中降低,打请请求转移到数据库。3、一直查询数据库所有的请求都
2022-04-03 16:26:05
3652
3
原创 Redis持久化AOF
简介以日志的形式来记录每个写操作(增量保存),将redis执行过的所有写指令记录下来(读操作不记录),只允许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一遍以完成数据恢复工作持久化流程(1)客户端的请求写命令基本操作AOF默认不开启可以在redis.conf中开启,其配置为appendonly.aofAOF文件与RDB路径一样。假如说同时开启AOF和RDB,系统默认读取AOF数据(
2022-04-03 10:55:18
767
原创 Spring循环依赖问题
目录三级储存分别储存的什么?梳源码为什么需要三级缓存?像是普通的java文件中也就是我只前讲解的文章中提到的循环依赖问题,是非常容易解决的,因为无疑创建的对象的生命周期就两个阶段。而Spring的循环依赖就不一样了,spring的生命周期要复杂的多下面列举的spring中比较重要的周期,其中循环依赖问题一般会出现,调用构造方法和填充属性的时期。按着之前的想法,解决循环依赖只需要在构造阶段暴露半成品对象即可一般Spring是这样处理的三级储存分别储存的什么...
2022-04-02 23:21:42
201
原创 循环依赖解决(由浅入深)步入Spring必读
什么是循环依赖?有以下三种依赖情况虽然方式不一样但是,依赖的本质是一样的,就是你完整的创建需要依赖我,我的完整也要依赖你,最终谁都都无法构建,造成构建失败产生循环依赖的情况/* *原因在创建A的过程中创建了B,创建B又需要创建A,而此时A还未创建完成, */public class CircularTest { public static void main(String[] args) { //造成了循环依赖问题, System.ou
2022-04-02 16:12:51
426
原创 SpringIOC仿写+解析
通过对springIOC的了解编写了一个简易的springMvc,源码已附上,讲解都在代码注释中大致流程就是先扫描包中的类和方法及其上面的注解,添加注解的放进HashMap容器中,完整代码Zth的源码库: Spring源码简单仿写部分代码截图...
2022-04-01 20:47:37
197
原创 单例模式详解+实现
什么是单例模式?假如一个对象被频繁的使用和销毁,那么对于内存来说无疑是比较浪费的,就比如说我们操作数据库,我们创建数据库连接去操作数据库,我们创建的数据库连接明明是可以重复利用的,但是我们却不停的创建和销毁,这就造成了资源的浪费,不光如此,如果我们频繁的创建连接去操作数据库,这也是非常危险的。这时就需要单例模式了,创造一个对象,并且重复利用,节省CPU了资源。懒加载方式...
2022-04-01 11:49:07
305
原创 Redis持久化RDB
简介:在指定的时间间隔内将内存的数据快照写入磁盘,也就是行话讲的快照,他恢复时是将快照的文件的直接读到内存里。如何执行?Redis会单独创建一个子进程(fork)来进行持久化,首先他会将数据写入到一个临时文件汇中,等待持久化的过程都结束了,在用这个历史文件代替上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就保证了极高的性能,如果需要进行大规模数据的回复,且对于数据的恢复,且对于数据的恢复的完整性不是很敏感,那RDB的方式比AOF方式更加的高效。缺点就是最后的一次持久化可能会丢失
2022-03-31 19:49:03
844
原创 redis事务乐观锁watch
先简单说一下悲观锁,悲观锁是指当一个线程访问一个对象时,会对其上锁,防止其他线程访问,直到线程对对象的操作结束,并且释放锁以后才能被其他线程访问,这样就保证了对对操作的正确定。乐观锁:乐观锁是指给数据加上一个版本号,一个操作获得数据时,并对其操做时,会更新其版本,当另个线程操作数据的时候会率先检查一下当前的版本是否和存储的版本一致,如果不一致,就重新获取一下值,并操作。这样同样保证数据的正确性。乐观锁顾名思义就是很乐观,感觉谁都不会修改数据,所以不对其上锁,只是去检验其版本号,这样设计的特性,使
2022-03-31 13:35:40
683
原创 Redis事务锁基本操作Multi Exec Discard
简介Redis事务是一个单独的隔离操作 :事务中的所有命令都会列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。假设有一串事务,里面有操作1,2,3,4 ,首先redis会将事务的一串操作进行序列化,让其一个个挨个执行,直到执行完毕,假如有操作6想插入其间,那是不可能的Multi Exec Discard从输入Mutil开始,输入的命令都会进入命令队列中,但是不执行直到输入 Exec后,会
2022-03-30 20:26:27
1539
原创 SpringBoot集成redis测试
新建springboot项目包名任意建好项目后 ,在pom中引入redis依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.4</version></depend..
2022-03-29 20:33:33
1197
原创 Jedis操作redis
创建Maven项目设置路径项目名称创建完成引入依赖<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> ..
2022-03-29 11:17:13
834
原创 redis的Bitmap、HyperLogLog、Geospatial
Bitmap(针对位操作字符串)简介现代计算机用二进制(位)作为信息的基础单位,1 个字节等于8位,例如"abc"字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,"abc" 分别对应的ASCII码分别是97、98、 99 ,对应的二进制分别是01100001、01100010和01100011 ,如下图合理地使用操作位能够有效地提高内存使用率和开发效率。java中位与操作是最快的,在Redis中同样道理,(实际上是字符串)Redis提供了Bitmaps这个“数据类型”可以实现对位.
2022-03-28 20:42:11
1105
原创 redis的发布和订阅
简介:Redis发布订阅(pub/sub) 是一种消息通信模式 :发送者(pub) 发送消息,订阅者(sub)接收消息。redis客户端可以订阅任意数量的消息。结构如图实操:订阅一个客户端SUBSCRIBE <订阅指定的频道>给指定频道发布信息,其中的1是订阅者的数量此时订阅此频道的客户端接收到消息注意:发布的消息没有进行持久化,假如说他是在你订阅前发布的helloword那么你将会收不到包括helloword消息在内的消息,例如...
2022-03-28 17:57:57
844
原创 redis中Zset的跳跃表(跳表)
1、简介。有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。2、实例对比有序链表和跳跃表,从链表中查询出511、有序链表你需要从链表头部开始一个一个遍历直到遍历到51的节点,需要查找6次。2、跳跃表...
2022-03-28 17:31:37
1552
原创 Redis五大常用数据类型
目录String概述:数据结构:操作:List(Redis列表)简介数据结构基本操作:Set(Redis集合)简介数据结构命令Hash(Redis哈希)简介数据结构命令Zset(redis有序集合)简介数据结构跳跃表/跳表(会有单独博客讲解)命令操作String概述:String是二进制安全的(基本数据类型),(只要用能用二进制表示,都能存),比如jpg图片,或者序列化后的对象,一个string的value.
2022-03-27 23:29:30
1638
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人