首页
统计
壁纸
关于我
Search
1
Mysql delete from table 和 truncate table 的区别
887 阅读
2
Spring AOP 术语说明
773 阅读
3
MySQL事务隔离级别
707 阅读
4
Java引用类型:强引用、软引用、弱引用、软引用
639 阅读
5
好冷
104 阅读
随笔
时政
技术
登录
Search
标签搜索
Java
Mysql
Xiaodong
累计撰写
6
篇文章
累计收到
43
条评论
首页
栏目
随笔
时政
技术
页面
统计
壁纸
关于我
搜索到
5
篇与
的结果
2024-01-23
Linux开启BBR
什么是BBR? BBR(Bottleneck Bandwidth and Round-trip time)是一种由谷歌开发的 TCP 拥塞控制算法,主要用于优化网络传输效率。开启BBR的特点? BBR 算法的特点是通过测量网络的带宽利用率和往返延迟时间(RTT),来判断网络的瓶颈位置,并根据这些信息来调整 TCP 的拥塞窗口大小,以达到最佳的传输效率。BBR 算法采用了一种基于模型的拥塞控制方法,能够在网络状况变化时自适应地调整拥塞窗口大小,从而提高网络传输的吞吐量和响应速度。 BBR 算法在实际应用中表现出了很好的性能,尤其是在高延迟和高丢包的网络环境中,它能够显著提高网络传输效率和稳定性。如何开启BBR?Linux kernel 4.9 及以上已支持 tcp_bbr1.查看系统内核版本:uname -r看内核版本是否大于等于4.9,否则要升级内核,或者安装bbr。2.开启BBR:echo "net.core.default_qdisc=fq" >> /etc/sysctl.confecho "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf3.保存生效:sysctl -p4.重启5.检查BBR是否启用:sysctl net.ipv4.tcp_available_congestion_control返回值一般为:net.ipv4.tcp_available_congestion_control = reno cubic bbrsysctl net.ipv4.tcp_congestion_control返回值一般为:net.ipv4.tcp_congestion_control = bbrsysctl net.core.default_qdisc返回值一般为:net.core.default_qdisc = fqlsmod | grep bbr返回值有类似:tcp_bbr 20480 10则BBR模块已启动
2024年01月23日
59 阅读
0 评论
0 点赞
2020-07-16
Spring AOP 术语说明
举个例子一个aspect切面classpublic class Logging { /** * This is the method which I would like to execute * before a selected method execution. */ public void beforeAdvice() { System.out.println("Going to setup student profile."); } /** * This is the method which I would like to execute * after a selected method execution. */ public void afterAdvice() { System.out.println("Student profile has been setup."); } /** * This is the method which I would like to execute * when any method returns. */ public void afterReturningAdvice(Object retVal) { System.out.println("Returning:" + retVal.toString()); } /** * This is the method which I would like to execute * if there is an exception raised. */ public void AfterThrowingAdvice(IllegalArgumentException ex) { System.out.println("There has been an exception: " + ex.toString()); } }SpringAOP.xml配置<bean id="student" class="com.seeyon.SpringBean.aop.Student" p:name="yangyu" p:age="27"></bean> <bean id="logging" class="com.seeyon.SpringBean.aop.Logging"></bean> <aop:config> <!-- 切面class --> <aop:aspect id="log" ref="logging"> <!-- 切点 --> <aop:pointcut id="studentMethod" expression="execution(* com.seeyon.SpringBean.aop.Student.get*(..))"/> <!-- 方法执行之前触发切面class的beforeAdvice方法 --> <aop:before pointcut-ref="studentMethod" method="beforeAdvice"/> <!-- 方法执行之后触发切面class的afterAdvice方法 --> <aop:after pointcut-ref="studentMethod" method="afterAdvice"/> </aop:aspect> </aop:config>术语说明术语说明Aspect(切面)泛指交叉业务逻辑,比如日志处理、事务处理的逻辑可以理解为切面,上面xml中aop:aspect标签表示的就是一个切面。JoinPoint(连接点)连接点指切面可以织入的位置,是一个虚拟的概念,可以理解为所有满足切点扫描条件的所有的时机。Pointcut(切入点)切面具体切入的位置,上面aop:pointcut标签表示的就是一个切点,也就是满足条件被扫描到的目标方法。Advice(通知/增强)切面的一种实现,可以完成切面的功能的函数,例如日志记录,权限验证,事务控制,性能检测,错误信息检测等。Weaving(织入)指将切面的逻辑插入到目标对象中的过程。参考:https://www.jianshu.com/p/c57a5a998c6b
2020年07月16日
773 阅读
17 评论
1 点赞
2020-07-07
MySQL事务隔离级别
什么是事务事务的定义数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。假如A转账给B 100元,先从A的账户里扣除100元,再在B的账户上加上100元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。事务的四大特性原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。事务并发存在的问题假设现在有张表CREATE TABLE `account` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `balance` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `un_name_idx` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;数据如下idnamebalance1张三1002李四200更新丢失(lost update)A和B事务并发执行,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了。第一类丢失更新(回滚丢失,Lost update)事务A和B并发执行,A事务修改数据并提交事务,然后B事务回滚事务,A事务已经提交的数据被回滚。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5存入 100 元,账户余额 200 元-T6提交事务-T7-取款10元,账户余额 90 元T8-回滚事务T9-账户余额 100 元(A事务更新丢失)第二类丢失更新(覆盖丢失/两次更新问题,Second lost update)事务A和B并发执行,A事务修改数据并提交事务,然后B事务修改数据并提交,A事务已经提交的数据被覆盖。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5存入 100 元,账户余额 200 元-T6提交事务-T7-取款10元,账户余额 90 元T8-提交事务T9-账户余额 90 元(A事务更新被覆盖)脏读(dirty read)A和B事务并发执行,A事务读取了B事务修改后未提交的数据,如果之后B事务进行事务回滚,则事务A读到的数据是不存在的脏数据。时间节点A事务B事务T1开始事务-T2-开始事务T3-查询账号余额 100 元T4-取款10元,账户余额 90 元T5查询账号余额 90 元-T6存入 100 元,账户余额 190 元-T7-回滚事务T8-账户余额 100 元T9提交事务-T10账户余额 190 元(数据被B事务干扰)-不可重复读(unrepeatable read)A和B事务并发执行,A事务读取了B事务修改并已经提交的数据,导致A事务内多次读取同一记录但结果却不相同不稳定。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5-取款10元,账户余额 90 元T6-提交事务T7查询账号余额 90 元(数据被B事务干扰)-幻读(phantom read)A和B事务并发执行,A事务读取了B事务提交的新增数据,这时A事务将出现幻读的问题。幻读一般发生在计算统计数据的事务中。时间节点A事务B事务T1开始事务-T2-开始事务T3查询ID大于1的账户数量:1-T4-新增账户(id:3,name:王五,balance:300)T5-提交事务T6查询ID大于1的账户数量:2 (莫名其妙多出一条数据)-可以看出前面几种问题都偏重于对同一记录的修改更新,幻读偏重于多条记录的增删,它们之间是递进的。事务的四大隔离级别ISO标准定义了4个事务隔离等级,分别是读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行化(Serializable)MySQL查看和设置隔离级别查看MySQL当前事务隔离级别命令:* show variables like 'tx_isolation' * show variables like 'transaction_isolation' * select @@tx_isolation * select @@transaction_isolation设置本次会话的事务隔离级别该设置只对本次会话的事务生效,不影响其他会话,随着本次会话关闭而失效。set session transaction isolation level read uncommitted / read committed / repeatable read / serializable设置全局会话的事务隔离级别该设置不影响当前已连接的会话,新会话使用新的事务隔离级别。set global transaction isolation level read uncommitted / read committed / repeatable read / serializable设置一次操作的事务隔离级别该设置只对下一次事务生效,随着事务的提交而失效。set transaction isolation level read uncommitted / read committed / repeatable read / serializableMySQL的事务四大隔离级别我们通过MySQL看看四大隔离级别的效果读未提交(READ UNCOMMITTED)读未提交是隔离级别最低的一种,打开两个MySQL连接,分别设置隔离级别,然后两个事务交替执行,如下:可以看到,事务A可以读取到事务B未提交的数据(事实上事务B也可以读到事务A的),如果一方回滚事务,则会造成脏读等严重问题。读已提交(Read Committed)可以看到,此隔离级别可以有效解决脏读的问题,但还是无法避免不可重复读的问题可重复读(Repeatable Read)可以看到,此隔离级别可以有效解决不可重复读的问题,接下来我们看看会不会出现幻读。显然,还是有幻读的问题。串行化(Serializable)可以看到,串行化隔离最严格,可以避免幻读问题,但效率也是最低的。在选择隔离级别时,需要考虑开发的业务环境和需求,以选择最适合自己业务的隔离级别。MySQL隔离级别的实现原理待续...
2020年07月07日
707 阅读
8 评论
1 点赞
2020-06-28
Mysql delete from table 和 truncate table 的区别
truncate属于DDL即数据控制语言而非DML数据操作语言,所做操作不能回滚。truncate是删除整张表后再重建,对比delete操作逐行删除数据效率高,特别是大数据表。truncate操作会执行隐式的commit,所以不能回滚。如果会话持有活动表锁,则不能执行 truncate 操作。InnoDB或者NDB表有字段作为外键被其他表引用时,对该表执行truncate操作会失败,表内字段间的外键关联不影响此操作。truncate操作不会返回删除记录数,操作成功提示的“0 rows affected”无实际意义。只要表格式文件tablename.frm是有效的,那么即使数据或者索引文件损坏了也能通过truncate操重新创建空表。执行truncate操作后,表中如果有自增序列字段的话,自增序列会重置回初始值。即使对于MyISAM和InnoDB也是如此,它们通常不重用序列值。对分区表执行truncate操作的话,表的数据和索引文件会删除重建,但是表分区定义文件则不受影响。truncate操作不会触发ON DELETE触发器。原文参见 官方文档
2020年06月28日
887 阅读
3 评论
1 点赞
2020-06-28
Java引用类型:强引用、软引用、弱引用、软引用
jdk从1.2开始,把对象的引用分为四个类型,这四种引用类型从生命周期从长到短依次是:强引用、软引用、弱引用、虚引用。Java引入这四种引用类型的目标主要有两个:一个是可以让程序员通过代码的方式控制对象的生命周期;一个是有利于jvm进行垃圾回收。强引用程序中最普遍的默认对象引用,也是程序开发中最常用的引用类型。JVM的垃圾回收期在任何时候都不会回收强引用。即使当内存空间不足抛出内存溢出(OOM),也不会回收具有强引用的对象来释放内存。我们可以显式的赋值对象为null,来告诉gc该对象不存在引用,这时gc就可以回收这个对象,但具体什么时候收集还是要取决于gc的算法。比如ArraryList类的clear方法中就是通过将引用赋值为null来实现清理工作/** * Removes all of the elements from this list. The list will * be empty after this call returns. */ public void clear() { modCount++; // clear to let GC do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; }软引用软引用用来描述一些有用但不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。比如下面的代码,即使obj赋值为null,软引用关联对象在内存充足的情况不会被回收。public class TestSoftReference { public static void main(String[] args) { Obj obj = new Obj("SoftReference"); SoftReference<Obj> sr = new SoftReference<>(obj); obj = null; System.gc(); System.out.println(sr.get().getName()); } } @Data @AllArgsConstructor class Obj { private String name; }运行结果:SoftReference弱引用弱引用用来描述一些非必须的对象。弱引用相比于软引用拥有更短的生命周期,当JVM运行垃圾回收的时候,不论内存是否充足,都会回收只被弱引用对象关联的对象。在java中,用java.lang.ref.WeakReference类来表示。比如下面的代码,obj赋值为null后,弱引用关联的对象会在执行垃圾回收后被回收。public class TestWeakReference { public static void main(String[] args) { Obj obj = new Obj("WeakReference"); WeakReference<Obj> wr = new WeakReference<>(obj); System.out.println(wr.get().getName()); System.out.println("----------------"); obj = null; System.out.println(wr.get().getName()); System.out.println("----------------"); // 推荐gc来回收 System.gc(); System.out.println(wr.get().getName()); } }运行结果:WeakReference ---------------- WeakReference ---------------- Exception in thread "main" java.lang.NullPointerException at com.xiao.temporary.TestRefrence.main(TestRefrence.java:25)虚引用顾名思义,就是形同虚设,即对对象而言是无感知的。与其他几种引用类型不同,虚引用不会影响和决定对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动(即对象是否存活的监控)。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。比如下面的代码,通过是否入列ReferenceQueue可以判断对象是否被回收。public class TestPhantomReference { public static void main(String[] args) { Obj obj = new Obj("PhantomReference"); ReferenceQueue<Obj> referenceQueue = new ReferenceQueue<>(); PhantomReference<Obj> pr = new PhantomReference<>(obj, referenceQueue); // 永远为null System.out.println("pr.get:" + pr.get()); // 是否入队,和是否被回收有关 System.out.println("pr.isEnqueued:" + pr.isEnqueued()); // poll一下referenceQueue中的对象看看 System.out.println("referenceQueue.poll:" + referenceQueue.poll()); System.out.println("----------------"); obj = null; System.out.println("pr.get:" + pr.get()); System.out.println("pr.isEnqueued:" + pr.isEnqueued()); System.out.println("referenceQueue.poll:" + referenceQueue.poll()); System.out.println("----------------"); // 推荐gc来回收 System.gc(); System.out.println("pr.get:" + pr.get()); System.out.println("pr.isEnqueued:" + pr.isEnqueued()); System.out.println("referenceQueue.poll:" + referenceQueue.poll()); } }运行结果:pr.get:null pr.isEnqueued:false referenceQueue.poll:null ---------------- pr.get:null pr.isEnqueued:false referenceQueue.poll:null ---------------- pr.get:null pr.isEnqueued:true referenceQueue.poll:java.lang.ref.PhantomReference@610455d6总结引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时软引用内存不足时对象缓存内存不足时弱引用jvm垃圾回收时对象缓存gc运行后虚引用未知未知未知
2020年06月28日
639 阅读
8 评论
4 点赞