- 博客(38)
- 收藏
- 关注
原创 MySQL事务日志——redo日志
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现而事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证。REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的特久性。UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。有的DBA或许会认为UNDO是REDO的逆过程,其实不然。REDO和UNDO都可以视为是一种恢复操作。
2024-12-02 22:10:53
1225
原创 事务常见分类
从事务理论的角度来看,可以把事务分为以下几种类型:扁平事务(Flat Transactions)带有保存点的扁平事务(Flat Transactions with Savepoints)链事务(Chained Transactions)嵌套事务(Nested Transactions)分布式事务(Distributed Transactions)
2024-12-02 20:57:29
1096
原创 事务隔离级别
MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排队 ,当该事务提交之后,其他事务才可以继续访问这个数据。
2024-12-02 20:52:56
860
原创 MySQL事务基础
事务是数据库区别于文件系统的重要特性之一,当有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失ACID是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是目的。数据库事务,其实就是数据库设计者为了方便起见,把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务。
2024-12-01 21:34:02
889
原创 数据库设计规范——总结
10.【强制】禁止在数据库中存储图片、文件等大的二进制数据通常文件很大,短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时。RDBMS的核心在于对实体和联系的定义,也就是E-R图(Entity Relationship Diagram),数据表越少,证明实体和联系设计得越简洁,既方便理解又方便操作。3.【建议】主键的名称以 pk_ 开头,唯一键以 uni_ 或uk_ 开头,普通索引以 idx_ 开头,一律使用小写格式,以字段的名称或缩写作为后缀。
2024-12-01 15:33:38
1273
原创 数据库设计规范——实战案例
此外,字段“supplierid(供应商编号)”“suppliername(供应商名称)”"stock(仓库)“只依赖于"listnumber(单号)”,不完全依赖于主键,所以,可以把"supplierid”“suppliername"stock"这3个字段拆出去,再加上它们依赖的字段"listnumber(单号)””,就形成了一个新的表“进货单头表”。第3步,在"商品信息表"中,字段"barcode"是有可能存在重复的,比如,用户门店可能有散装称重商品和自产商品,会存在条码共用的情况。
2024-12-01 15:26:24
792
原创 数据库设计规范——反范式
有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,就要遵循业务优先的原则,首先满足业务需求,再尽量减少冗余。如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询,在一定程度上会影响数据库的读性能。如果想对查询效率进行优化,反范式优化也是一种优化思路。此时,可以通过在数据表中增加冗余字段来提高数据库的读性能。规范化 vs 性能为满足某种商业目标 , 数据库性能比规范化数据库更重要。
2024-12-01 15:15:46
651
原创 数据库设计规范——范式
开发中,会出现为了性能和读取效率违反范式化的原则,通过增加少量的冗余或重复的数据来提高数据库的读性能,减少关联查询、join表的次数,实现空间换取时间的目的。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如: 职工表一 (职工编号,职工孩子姓名),职工表二 (职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。因为范式等级越高,设计出来的数据表就越多、越精细,数据的冗余度就越低,进行数据查询的时候就可能需要关联多张表,这不但代价昂贵,也可能使一些索引策略无效。
2024-12-01 15:08:31
1376
原创 Java线程池之ThreadPoolExecutor
(1)自己创建一个单线程串行执行任务,如果任务执行失败而终止那么没有任何补救措施,而线程池还会新建一个线程,保证池的正常工作。(1)线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。整个线程池表现为线程数会根据任务量不断增长,没有上限,当任务执行完毕,空闲。,意味着:全部都是救急线程(60s 后可以回收),救急线程可以无限创建。时,会放入无界队列排队。(3)如果队列选择了有界队列,那么任务超过了队列大小时,会创建。并没有线程空闲,这时再加入任务,新加的任务会被加入。
2024-11-24 21:30:02
1165
原创 MySQL查询优化
覆盖索引: SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据理解方式一: 索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了满足查询结果的数据就叫做覆盖索引。理解方式二。
2024-11-23 16:37:46
871
原创 MySQL索引失效案例
对于单列索引,尽量选择针对当前query过滤性更好的索引在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面总之,书写SQL语句时,尽量避免造成索引失效的情况。
2024-11-23 11:25:08
932
原创 MySQL性能分析工具的使用
能看到页的数量是刚才的 20 倍,但是查询的效率并没有明显的变化,实际上这两个 SQL 查询的时间基本上一样,就是因为采用了顺序读取的方式将页面一次性加载到缓冲池中,然后再进行查找。如果想要查看某条SQL语句的查询成本,可以在执行完这条SQL语句之后,通过查看当前会话中的last_query_cost变量值来得到当前查询的成本。如果从磁盘中对单一页进行随机读,那么效率是很低的(差不多10ms),而采用顺序读取的方式,批主对页进行读取,平均一页的读取效率就会提升很多,甚至要快于单个页面在内存中的随机读取。
2024-11-22 22:39:33
1144
原创 MySQL索引设计原则
目录一.哪些情况适合创建索引1.字段的数值有唯一性的限制2.频繁作为 WHERE 查询条件的字段3.经常 GROUP BY 和 ORDER BY 的列4.UPDATE、DELETE 的 WHERE 条件列5.DISTINCT 字段需要创建索引6. 多表 JOIN 连接操作时,创建索引注意事项7. 使用列的类型小的创建索引8. 使用字符串前缀创建索引9. 区分度高(散列性高)的列适合作为索引10.使用最频繁的列放到联合索引的左侧11. 在多个字段都要创建索引的情况下,联合索引优于单值索引二.限制索引的数目三.
2024-11-19 22:28:09
1020
原创 MyISAM与InnoDB索引的区别
举例2:用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时,数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。举例1:知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有二级索引都引用主键索引,过长的主键索引会令二级索引变得过大。③ InnoDB的非聚簇索引data域存储相应记录 主键的值 ,而MyISAM索引记录的是 地址。
2024-11-18 21:44:35
382
原创 MySQL的聚簇索引和二级索引
索引按照物理实现方式,索引可以分为 2 种:聚簇(聚集)和非聚簇(非聚集)索引。也可以把非聚集索引称为二级索引或者辅助索引。
2024-11-18 21:30:53
904
原创 MySQL索引的底层实现原理是什么?
下图这样的数据结构,就是B+树:每个蓝框表示一个数据页,最下面的叶子节点存放一条条真实的数据,这些数据之间用单向链表连接,叶子节点之间用双向链表连接。通过B+树实现索引,MySQL可以有效地支持大量数据的快速查询、插入、删除和更新操作。而不是实际的数据,这样可以让更多的键值放入一个节点,减少树的高度,提高查询效率。这确保了从根节点到每个叶子节点的路径长度相同,保证了查询效率的一致性。这使得范围查询变得高效,因为可以通过叶子节点的链接顺序访问数据。这样可以在查找数据时,通过二分查找快速定位数据位置。
2024-11-18 21:10:41
354
原创 ReentrantLock
相对于它具备如下特点:(1)可中断 : lock.lockInterruptibly 与 thread.interrupt()(2)可以设置超时时间 :lock.tryLock(long timeout, TimeUnit unit)(3)可以设置为公平锁/非公平锁 :new ReentrantLock(boolean fair)公平锁(FairSync):线程获取锁的顺序按照线程加锁的顺序来分配(先来先得)非公平锁(默认,NonfairSync):获取锁的抢占机制,随机。
2024-11-18 17:16:42
873
原创 Synchronized原理
由于轻量级锁会自旋,即不会放弃CPU,那么对一些执行时间短的任务而言,用轻量级锁可以减少线程切换的时间(对比重量级锁)。(1)偏向锁通过对比 Mark Word 解决加锁问题,避免执行CAS操作。(2)轻量级锁是通过用 CAS 操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。(3)重量级锁是将除了拥有锁的线程以外的线程都阻塞。
2024-11-17 21:36:24
840
原创 Java中的CAS
CAS:全称Compare and swap,字面意思:“比较并交换”,一个CAS涉及到以下操作:我们假设内存中原数据V,旧的预期值A,需要修改的新值B。1. 比较A与V是否相等(比较)2. 如果比较相等,将B写入V。(交换)3. 返回操作是否成功。多个线程同时对一个公共资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。// 需要不断尝试,直到成功为止// 比如拿到了旧值 1000// 在这个基础上 1000-10 = 990/*
2024-11-17 18:03:32
2877
原创 SpringMVC的视图
当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。这个过程中,张三只向李四请求借钱,但实际上钱是从王五那里借来的。
2024-11-17 15:30:14
2311
原创 SpringMVC域对象共享数据
这个接口就像是一个数据存储的通用容器,为不同的数据类型提供了统一的存储方式。(2)ModelMap是一个实现了Model接口的类,它扩展了LinkedHashMap,可以用于在控制器方法中向 request 域对象共享数据。这个类就像是一个数据传递的具体实现,为数据的共享提供了实际的操作方法。这个接口就像是一个数据传递的规范,为不同的实现提供了统一的标准。对象作为参数,并且通过这个对象向 request 域对象共享数据。对象作为参数,并且通过这个对象向 request 域对象共享数据。
2024-11-17 11:38:38
933
原创 SpringMVC获取请求参数的4种方式
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数。value:指定为形参赋值的请求参数的参数名。
2024-11-16 21:28:22
429
原创 volatile原理
(4)线程2 执行 ready = true,切换到线程1,进入 if 分支,相加为 0,再切回线程2 执行 num = 2。是从自己工作内存中的高速缓存中读取这个变量 的值,结果永远是旧值。写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后。读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。的值缓存至自己工作内存中的高速缓存中, 减少对主存中 run。)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据。)保证在该屏障之前的,对共享变量的改动,都同步到主存当中。
2024-11-16 11:38:58
443
原创 @RequestMapping注解
将请求和处理请求的控制器方法关联起来,建立映射关系。2.@RequestMapping标识一个类:设置映射请求的请求路径的初始信息(当同时修饰类和方法时,请求的 url 就是组合 /类请求值/方法请求值)/user/**/createUser: 匹配 /user/createUser 、 /user/aaa/bbb/createUser 等 URL。/user/*/createUser: 匹配 /user/aaa/createUser 、 /user/bbb/createUser 等 URL。
2024-11-16 10:39:35
713
原创 Monitor的原理
时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入 EntryList 重新竞争。给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向。,就会进入 EntryList BLOCKED。Lightweight Locked:轻量级锁。Heavyweight Locked:重量级锁。中等待的线程来竞争锁,竞争的时是非公平的。方法进入 WAITING 状态的线程。执行完同步代码块的内容,然后唤醒。的线程都处于阻塞状态,不占用。Biased:偏向锁状态。线程发现条件不满足,调用。
2024-11-12 06:40:26
440
原创 线程的生命周期
(4)WAITING(等待):表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如通过wait()方法进行等待的线程等待一个 notify()或者 notifyAll()方法,通过join()方法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线程就进入了 RUNNABLE 状态继续运行。(5)TIMED_WAITING(计时等待):表示线程进入了一个有时限的等待,如sleep(3000),等待3秒后线程重新进行 RUNNABLE 状态继续运行。线程刚被创建,但是还没有调用。
2024-11-12 05:55:39
287
原创 HashSet
HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为present,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层HashMap 的相关方法来完成,HashSet 不允许重复的值。它内部使用 LinkedList 来维护元素的顺序,同时使用 HashMap 来保证元素的唯一性。HashSet 的添加、删除和查找操作的性能通常都是常数时间的(O(1)),这得益于 HashMap的性能。
2024-11-09 14:56:57
1085
原创 List接口相关问题
RandomAccess和Cloneable、Serializable接口一样,本质上都是一种标志性接口,无具体实现,意在告知JVM此类(在恒定时间内)可支持快速随机访问。(1)给List使用的标记型接口,目的是使其支持(在恒定时间内)的快速随机访问(2)推荐在遍历集合的时候检查该List是否实现了RandomAccess接口,以便让不同的集合使用更优的遍历算法(ArrayList用for循环遍历快一些,LinkedList用迭代器遍历快一些)
2024-11-09 13:19:31
2038
原创 集合框架基础
简而言之,每当我们尝试修改这个列表(如添加、删除元素)时,它实际上并不直接在当前的列表上进行修改,而是先将当前列表复制一份,然后在这个副本上进行修改,修改完毕后再将原列表的引用指向新修改过的列表。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。
2024-11-08 16:10:48
905
原创 Java 中的泛型
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。从JDK1.5以后,Java引入了“参数化类型()”的概念,允许我们在创建集合时再指定集合元素的类型,正如:,这表明该List只能保存字符串类型的对象。JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,
2024-11-08 07:46:31
777
原创 包装类相关问题
装箱:将基本类型用他们对应的引用类型包装起来拆箱:将包装类型转换为基本数据类型;//JDK5.0以后,java提供了自动拆装箱//(自动)装箱——底层调用的是valueOf方法//(自动)拆箱——底层调用的是intValue方法。
2024-11-08 05:48:24
185
原创 Delphi学习笔记(四)
Delphi中的消息对话框(一)showmessage()只有一个OK按钮,括号中填入希望提示的字符串 例:showmessage(‘除数不能为0!!’); (二)messageBox()1、函数原型及参数 function MessageBox(hWnd: HWND, Text, Caption, Type: Word): Integer; hWnd:对话框父
2016-08-14 20:58:32
648
原创 Delphi学习笔记(三)
字体与窗口位置的随机变化1.在system栏中选择时间控件加到form中2.对时间控件设置(label标签字体大小随机变化,form窗口位置随机变化,颜色随机变化) 3.设置label标签大小随字体大小变化而变化 4.设置窗口大小随标签大小变化而变化选择结构if else举例1.产生两个随机数,计算它们的值并验证
2016-08-10 19:59:31
520
原创 Delphi学习笔记(二)
数学类函数(1)绝对值函数:abs(x)例:x:=abs(-2);(2)取整函数:① Trunc(x):Int(64); 返回实型数据x的整数部分,类型为Int(64)② Round(x):Int(64); 返回实型数据x的小数部分四舍五入后的整数部分③ Int(x):Extended; 返回实型数据x的整数部分,类型为Extended(3)取小
2016-08-09 21:55:00
882
原创 Delphi学习笔记(一)
(一)鼠标点击显示和清除文本框内容1.将文本框和按钮布局好后,在Object Inspector窗体中找到Text和Visible2.Text的内容即文本框要显示的内容3.Visible初始值设置为False,不可见4.双击显示按钮,在代码中写入 Edit1.Visible:=true; 即点击后使文本框可见,‘:=’为赋值 5.双击清除按钮,在代码中写入
2016-08-08 21:29:28
713
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人