切面跟注解
不中断部署
k8s+docker可以实现。需要再去学习。
- 乐观锁 悲观锁 共享锁 排他锁
乐观锁,读不加锁,写加锁,悲观锁,读写都加锁。共享锁又称为读锁,在mysql中他是表级别的,表示多个事务可以共享一把锁,只能读不能写。排他锁又可以称为写锁,行级别。只允许一把锁存在。
tomcat高并发下,单台瓶颈是3000
什么是多线程,为什么使用多线程,结合实际项目说说。
在多任务的系统中,为了提高系统的吞吐量,程序中启动多个线程并发执行任务。在java中,线程是thread,线程池是executor。比如:在一次访问中,可能要进行数据查询10次,有快有慢但是之间互不相关,这个时候我们就可以对每一个查询启动一个线程,让查询并发执行,最后等待线程都执行完了之后再进行后续逻辑。
- 线程安全的问题
多线程安全三大特性:原子性、有序性、可见性,CPU内存缓存一致性问题导致了原子性和可见性问题,可以查看mesi协议mesi。
- 原子性:在一个操作中不可以在中途暂停然后再调度,要不执行完成,要不就不执行。线程之间是互相独立的。非原子性的操作,在并发的过程中会产生线程安全问题。
- 有序性:在本线程内,查询是有序性的。但是在多线程的情况下,由于编译器优化重排序、指令优化重排序,会导致线程之间的无序性。
- 可见性:当一个线程修改了线程共享变量的值,其它线程是不可见的。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的,无论是普通变量还是volatile变量都是如此,普通变量与volatile变量的区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每使用前立即从内存刷新。因为我们可以说volatile保证了线程操作时变量的可见性,而普通变量则不能保证这一点。
常见解决多线程安全的方法有synchronized,volatile,Lock ReentrantLock ReentrantReadWriteLock。
- web开发中数据库可能存在的问题。
- 连接数问题,如果并发量过大,数据连接数将会不够。mysql的最大连接数默认是100, 最大可以达到16384。因此一般我们都需要使用数据库连接池来进行控制。
- 性能问题,对数据库进行增删改查,反应时间的长短问题。单表数据量大了之后,查询效率变低。常用优化方式有SQL优化;索引;缓存;分区;分表;分布式;主从复制读写分离,主负责写,从负责读。
- 存储空间问题,相对来说,磁盘空间成本比较低,因此一般情况都需要牺牲储存空间来换时间。
- 如何分表。分表的算法。
首先能不分表尽量不分表
- 数据量大于500~1000万时,需要考虑进行分表。
- 数据增长过快。
- 需要对某些字段进行切分
- 出于安全可靠。
数据库分布式事务。
MyCat进行分库分表