1.java中事务是如何和数据库进行交互,并控制数据库的。
在Java中,事务与数据库的交互和控制主要通过JDBC(Java Database Connectivity)API进行。JDBC为Java应用程序提供了一种标准的方式来访问关系型数据库。事务管理在数据库操作中非常重要,因为它能确保数据的完整性和一致性。 binlong是mysql数据库中的一个重要日志文件,它记录了对数据库进行的所有更改操作。理解binlog对于了解事物管理及数据恢复有很大的帮助。
binglog是二进制的日志文件,用于记录所有更改数据库状态的操作。这些操作包括插入,更新,删除等。binlog主要用于数据库的复制和恢复。
binglog的作用是数据库的复制和数据的恢复。
事务与binlog的关系 binlog记录了事务的详细信息,并通过一下方式与实物管理相关: 1.事务的写入,事务的提交和回滚。binlog格式。
binlog的底层工作机制: 1.写入:当一个事物在Mysql中执行时,数据库系统会将事务的所有更改操作写入binlog。这些写入操作是异步的,不会立即影响数据文件中的数据。
2.同步: 在事务提交时,数据库系统会将binlog中的更改操作应用到数据文件中,并将这些操作标记为已提交。binlog的提交确保了事务的持久性和一致性。
3.恢复: 在数据库恢复过程中,binlog文件可以被用于重做操作或回滚操作,已恢复到特定的时间点。
2.java并发包
java的并发包主要位于java.util。concurrent包中,这个包提供了丰富的类和接口,目的在于编写更加易于维护的多线程应用程序。
1.并发集合类
ConcurrentHashMap:这是一个线程安全的哈希表,用于存储键值对。它允许多个线程同时读取数据而无需锁定整个表,从而提高了读取操作的性能。
ConcurrentLinkedqueue:这是一个线程安全的队列,支持高并发的队列操作。它使用无锁算法实现高效的并发性能。
CopyOnWriteArrayList:这是一个线程安全的列表,它在修改(写入)操作时创建新的数据副本,而不是直接修改原始数据,从而避免了写入冲突。
2.线程池与Executor框架
Executor框架是一个用于管理和执行线程任务的机制,他将任务的提交与任务的执行解耦,简化了线程池的管理。
线程池是一组可用于执行任务的线程集合,通过合理的配置线程池的大小和类型,可以优化资源的利用和提高系统的响应速度。
3.锁与同步器
ReentrantLock(可重入锁):提供了比synchronized更灵活的锁机制,包括尝试非阻塞的获取锁,可中断地等待锁,定时等待锁等特性。
CountDownLatch(门栓):允许一个或多个线程等待其他线程完成操作。
CyclicBarrier(栅栏)和Phaser(可控制栅栏):允许多个线程互相等待,知道所有线程都到达某个公共屏障点。
ReadWriteLock(读写锁):允许多个线程同时读取资源,但只允许一个线程写入资源,从而提高了并发性能。
Semaphore(信号量):可以用来控制同时访问某一特定资源或资源池的操作数量。
4.原子变量类: java并发包还包含了一系列原子变量类(如AtomicInteger,AtomicLong等),它们支持原子性的操作,可以在多线程环境中无锁地实现数据的更新。
5.其他工具类
ThreadLocal:提供了线程局部变量。这些变量和普通的可共享变量不同,因为每一个访问这个变量的线程都有它自己的独立初始化的变量副本。
Excutors:提供了一系列工厂方法用于创建不同类型的线程池。
3.阿里ESS详细解释
工作原理:监控数据收集,阿里ESS持续监控云资源的性能指标(如CPU,内存,磁盘I/O等),并收集相关数据。
策略评估:根据用户配置的伸缩策略,评估当前资源的状态是否需要调整。策略可以基于阈值(如CPU利用率达到80%)或时间(如工作日高峰时段)
触发伸缩操作:当评估结果满足伸缩条件时,ESS会自动执行相应的操作,如启动新实例或关闭闲置实例。
实例管理,对新启动的实力进行初始化,配置和负载均衡,确保他们能够正常工作并参与到应用负载中。
报告与通知,提供伸缩操作的日志和通知,让用户了解资源的变化情况。
配置管理:
1.创建伸缩组:伸缩组是弹性伸缩的基本单位,包含了一组可以自动伸缩的实例。
2.在阿里云控制台中,你可以创建伸缩组并配置其基本信息,如实例类型,数量,策略等。
2.设置伸缩策略:
1.定义触发伸缩的条件,包括CPU利用率,内存使用量,请求数等。
2.可以设置简单策略(如固定阈值)或复杂策略(如基于时间的动态调整)。
3.配置通知与报警
设置报警规则,以便在伸缩操作发生事接收通知。
可以将报警信息发送到邮箱,短信或其他通知渠道。
4.监控和优化;
使用阿里云提供的监控工具查看伸缩组的性能指标和历史记录。
根据实际的业务需求调整伸缩策略,以优化资源利用和成本效益。
5.使用场景 业务高峰期:在业务高峰期时,自动增加实例以应对突发的高流量。
负载波动,自动调整资源以使用业务负载的不懂,确保系统的稳定性和响应速度。
成本控制,在负载较低的情况下,减少不必要的实力,以降低成本。
6.注意事项 策略设计,合理设计伸缩策略,以确保系统能够奎苏响应负载变化,同时避免过于频繁的伸缩操作。
监控数据,定期检查监控数据和伸缩记录,确保系统按预期工作。
测试:在生产环境部署之前,在测试环境中验证伸缩策略和操作,以确保其效果和稳定性。
7.相关工具与服务
阿里云,提供详细的监控和报警功能,与ESS配合使用,能够更好的管理和优化资源。
阿里云SLB:与ESS结合,自动将流量均衡的分配到伸缩组中的实例上。
4.mysql优化,怎么优化
调整Mysql配置文件,根据服务器的硬件配置和应用负载调整Mysql配置参数。主要参数包括:
innodb_buffer_pool_size:设置 InnoDB 存储引擎的缓存池大小,通常设置为总内存的 60%-80%。query_cache_size:设置查询缓存的大小,但需要注意,MySQL 8.0 已废弃此参数,使用缓存可能导致性能下降。max_connections:设置最大连接数,根据应用的并发需求进行调整。innodb_log_file_size:设置 InnoDB 日志文件的大小,大日志文件可以减少日志写入的频率。table_open_cache:增加表缓存数量,减少表打开的开销。慢查询日志:启用慢查询日志(
slow_query_log)并设置合适的查询时间阈值,以便识别和优化执行时间长的查询。
long_query_time:设置记录慢查询的时间阈值。
查询优化:
重写查询语句以提高执行效率。例如,使用内连接(join)替代子查询,避免不必要的计算。
使用EXPLAIN,使用EXPLAIN语法分析查询执行计划,查看查询是否使用了索引,识别可能得性能瓶颈。
EXPLAIN select * from your_table where condition。
限制数据量:只选择必要的列和行,避免select * 语句,使用LIMIT限制查询结果的数量。
避免全表扫描,确保查询条件使用了索引,避免全表扫描导致的性能问题。
索引优化:创建索引,为经常用于查询条件,连接条件,排序和分组的列创建索引。常用的索引类型包括单列索引和和联合索引。
索引选择,选择适当的列进行索引,不要对低基数列(如布尔值)创建索引,这样索引效果不佳。
删除冗余索引,定期检查和删除未使用或冗余的索引,以减少维护成本和存储开销。
监控索引效果,使用SHOW index from table_name查看表中的索引,使用ANALYZE_TABLE更新表的统计信息,以优化查询计划。
数据库维护:定期优化表,使用 OPTIMIZE TABLE 命令来整理数据表,释放空间和提高性能。
OPTIMIZE TABLE your_table。
数据备份和恢复:定期进行数据备份,确保数据的安全性。合理配置备份策略,避免备份操作影响数据库性能。
连接优化,使用连接池来管理数据库连接,以提高连接的复用性,减少连接创建和销毁的开销。
连接超时,设置合理的连接超时时间,避免连接泄漏和资源浪费。
性能监控,使用Mysql的性能模式,和其他监控工具监控数据库性能指标。
慢查询分析,定期分析慢查询日志,识别性能瓶颈并进行优化。
资源消耗分析,分析CPU,内存,磁盘和网络资源的使用情况,以便进行针对性的优化。
高可用性与拓展,主从复制,配置主从复制以实现读写分离和数据备份,提高系统的可用性。
读写分离,将读操作分发到从服务器,奸情主服务器的负担,提高系统的整体性能。 分布式数据库,在需要时使用分布式数据库技术(如分片,分布式存储)来处理大规模的数据集和高并发请求。
分布式数据库,在需要时使用分布式数据库技术(如分片,分布式存储)来处理大规模的数据集和高并发请求。
5.什么情况下会产生回表操作
在数据库查询过程中,回表(Index Lookup)操作通常发生在使用非聚集索引(也称为二级索引或辅助索引)进行查询时。具体来说,以下几种情况可能导致回表操作: 非聚集索引查询: 当使用非聚集索引进行查询,并且索引中不包含查询所需的所有列时,数据库需要根据非聚集索引中存储的行标识符(通常是主键或其他聚集索引的键值)返回到聚集索引或数据表中获取完整行数据。
索引覆盖不足: 如果查询的WHERE子句中使用的字段和SELECT子句中请求的字段不在同一个索引上,或者索引的列顺序不能满足查询需求,那么数据库可能需要回表来获取缺失的列数据。
主键查询后的附加列读取: 即使是在主键索引上进行查询,如果查询中还包含了其他非索引列,那么也需要回表来获取这些列的数据。
索引选择性不高: 如果非聚集索引的选择性不高,导致需要扫描大量索引条目,即使索引覆盖了查询所需所有列,也可能因为性能原因而选择回表。
为了减少回表操作,可以采取以下策略: 创建复合索引:确保索引包含查询中经常一起出现的列。
优化查询语句:尽可能只选择必要的列,避免使用SELECT *。 使用覆盖索引:创建包含查询所需所有列的索引,使得查询可以直接从索引中获取数据,无需回表。 在MySQL的InnoDB存储引擎中,由于其聚簇索引的设计,主键索引本身就是数据行的物理存储顺序,因此非主键索引查询往往会导致回表操作。
6.mysql主从复制挂了怎么办,怎么保证高可用
mysql主从复制挂了,如何处理:
检查错误日志: 查看主库和从库上的错误日志,寻找有关复制失败的信息,如错误代码和描述。
检查复制状态: 使用SHOW SLAVE STATUS \G;命令查看从库的复制状态,检查是否有错误或停止的复制线程。
检查网络连接: 确保主从之间的网络连接正常,没有防火墙或路由规则阻止复制流量。
检查磁盘空间: 确保从库有足够的磁盘空间来存储二进制日志文件。
检查二进制日志: 在主库上检查二进制日志是否开启并且配置正确。
根据错误日志中的信息,修复导致复制失败的问题,例如数据类型不匹配、主键冲突等。
重启复制: 使用START SLAVE;命令重新启动从库上的复制线程。
高可用性保障:
1.多从架构,使用多个从库,其中一个作为备用主库,可以在主库故障时快速切换。
2.半同步复制,使用半同步复制机制,确保主库在提交事务前至少有一个从库接收到了事务,提高数据一致性。
3.组复制,使用MySQL的组复制功能,这是一种基于Paxos协议的多主复制模式,可以提供更高的可用性和容错性。
4.MHA,使用MHA工具自动检测主库故障并自动将从库提升为主库,实现快速故障转移。
5.Keepalived,结合Keepalived或Heartbeat等工具,可以监测数据库服务状态并自动切换VIP(虚拟VIP),实现负载均衡和故障切换。
6.定期备份与恢复计划,定期备份数据,并确保能够快速回复,以防数据丢失。
7.监控与报警,实施全面的监控系统,对数据库性能和健康状况进行实时监控,并设置报警机制,以便及时响应故障。
8.读写分离,将读操作分发到从库,写操作集中在主库,减轻主库压力,提高系统整体性能和可用性。
9.异地多活,在不同地理位置部署数据库实例,实现地理上的冗余,提高灾难恢复能力。
7.熔断降级的具体应用
Hystrix已经停更不维护了。Sentinel是阿里巴巴开源的一个流量控制组件,它提供了流量控制,熔断降级,系统自适应保护和热点防护等功能。Sentinel的配置和使用相对Hystrix更为灵活和强大。
具体应用就是在项目中引入Sentinel的依赖,并配置SentinelDashboard。然后,可以使用@SentinelResource注解来定义资源和降级策略:
@RestController public class UserController {
@Autowired private OrderService orderService; @GetMapping("/user/{id}") @SentinelResource(value = "getUser", fallback = "handleException") public User getUser(@PathVariable("id") int id) { return userService.getUser(id); } public User handleException(int id) { // 返回一个默认的用户对象或错误信息 return new User("Default User"); }} 上述示例中,@SentinelResource注解标记的方法getUser被Sentinel监控,当触发熔断条件时,将调用handleException方法返回默认响应。
8.oom如何排查,GC垃圾回收机制 OOM造成的原因:
堆内存不足:应用程序创建了过多的对象,超过了JVM堆的最大限制。
内存泄漏:不再使用的对象未被垃圾回收,导致可用内存逐渐减少。
大对象分配:创建了非常大的对象,导致内存不足以一次性分配。
永久代/元空间溢出:类和方法元数据过多,超过了永久代或元空间的限制。
线程栈溢出:线程栈深度过大或线程数量过多,导致内存耗尽。
排查OOM问题:
1.分析GC日志:
检查GC日志,了解GC的频率,类型和效果。
检查Full GC的出发频率和原因,以及Young GC的效率。
分析GC停顿时间,识别长时间停顿的原因。
2.使用内存分析工具:
使用VisualVM,JProfiler,YourKit等工具进行内存快照分析。 分析堆转储文件,找出内存占用高的对象。
3.检查内存配置:
检查JVM启动参数,如-Xms, -Xmx, -XX:PermSize, -XX:MaxPermSize, -XX:MetaspaceSize, -XX:MaxMetaspaceSize等。
调整堆大小和GC参数,比如改变年轻代和老年代的比例
4.代码审查:
检查代码中是否存在内存泄漏的潜在问题,如静态集合的不当使用,长生命周期对象的不当持有等。
确认没有不必要的对象创建,尤其是在循环中。
5.监控和性能测试:
监控应用程序的内存使用情况,特别是在高负载下。
进行压力测试,模拟生产环境的负载,观察内存消耗。
6.优化数据结构和算法:
选择更高效的数据结构和算法,减少内存使用。
考虑使用弱引用,软引用等来管理对象引用,帮助GC更有效地回收内存。
GC垃圾回收机制;
1.分代收集:
新生代(Young Generation):对象刚创建时所在的区域,包括Eden区和Survivor区。
老年代(Old Generation):长期存活的对象会被晋升到老年代。
永久代/元空间(Permanent Generation/Metaspace):存储类的元数据。
GC算法:
标记-清除:标记不再使用的对象,然后清除它们。
复制算法:将对象从一个区域复制到另一个区域,清理源区域。
标记整理:标记后不仅清楚,还会整理剩余对象,减少碎片。
分代收集,针对不同代使用不同的算法。
GC触发条件:
内存不足时触发。 显示调用System.gc(),但不推荐。
GC停顿,整个应用程序暂停,进行GC。
9.数据库如何进行主从切换
1.停止从库的复制进程
2.将从库提升为主库
3.在原主库上停止写操作,知道从库完成数据同步。
4.在原主库上获取二进制日志的位置
5.在原主库上,创建新的二进制日志文件,并通过命令获取它,使用获得的二进制日志文件名和位置,配置原主库为新的从库,包括设置正确的参数。
6.启动配置好的新从库上的复制进程。
7.使用show slave检查复制状态,确认复制是否成功启动。
10.时间复杂度
11.数组和链表有何区别,什么情况下用数组,什么情况下用链表
数组的内存布局是连续存储,支持随机访问,可以通过下标找到任何一个元素(时间复杂度O(1)),插入和删除:在数组中插入或删除元素通常需要移动大量元素,以保持连续性,这可能导致较高的时间复杂度(O(n))。 数组是固定大小。
链表的内存布局是非连续的,每个元素(节点)包含数据和一个指向下一个节点的指针。
链表不支持随机访问,必须从同遍历,时间复杂度O(n).
插入删除,链表只需要修改相邻节点指针,不需要移动元素,所以时间复杂度O(n)。 链表是动态大小。
数组在频繁随机访问的场景中,如缓存,固定大小的数据集,图像处理等。 链表适用于需要频繁插入和删除元素的场景,如实现动态大小的队列,栈,或在不知道数据集大小的情况下存储数据。
12.接口的性能优化
1.减少网络延迟
2.数据库优化
3.代码层面的优化
4.架构的优化
5.缓存策略
6.并发编程
7.监控和调优
8.硬件与网络优化
13.如何建立符合索引,一般你加在哪些字段?建索引的理论依据或者经验是什么?
答:1.禁止在更新十分频繁,区分度不高的属性上建立索引。
2.建立组合索引,必须把区分度高的字段放在前面。
14.Innodb的行锁到底锁了什么?
答: InnoDB的行锁,是通过锁住索引来实现的,如果加锁查询的时候没有使用索引,会将整个聚簇索引都锁住,相当于锁表了。命中索引锁行,没命中就锁表。
mysql锁级别:
1.表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,1发生锁冲突的概率最高,并发度最低。
2.行级锁:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3.页面锁(不要求)开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。
如果索引没有命中,where条件没有加索引,那么会行锁变成表锁。
15.什么是回表?
在idx_age二级索引树找到主键id后,回到id主键索引搜索的过程,就成为回表。 具体说就是在InnoDB存储引擎中,当通过非聚簇索引查询数据时,由于索引中不包含完整的行数据,因此需要根据索引中找到的主键值再去聚簇索引中查找完整的行数据,这个过程就是回表。
16.如果一张表数据量级是千万级别以上的,要给这张表添加索引,你需要怎么做呢?
一句话,建新表+建索引+导数据+废旧表
17.Mysql删除重复数据-解决线上数据库存在重复数据的问题。
18.Mysql千万级数据分页的优化
1.使用覆盖索引+子查询优化:先建主键id索引,那么就可以在索引树中找到开始位置的id值,再根据找到的id值查询行数据。
2.起始位置重定义
避免使用偏移量
3.服务降级不让使用 当偏移量超过某个值时,直接返回4XX错误,不让使用。
19.Innodb的特性
20.AOP通知的正常流程的返回顺序
21.AOP通知异常流程的返回顺序
异常情况下,环绕通知只有一半,后面的BBB没有。
22.如何在微服务的日志中记录每个接口URL,状态码和耗时信息?
1.全局GetWay方式
2.上下文切换: 多线程编程中一般线程的个数都大于CPU核心的个数,而一个CPU核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU采取的策略是为每个线程分配时间片并轮转的形式,当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用。这个过程就属于一次上下文切换。概括来说就是:当前任务在执行完CPU的时间片切换到另一个任务之前会先保存自己的状态,一遍下次再切换回这个任务时,可以再加载这个任务的状态。任务从报错到再加载的过程就是一次上下文切换。
23.自定义注解
24.出入库的实际设计流程
25.什么是设计模式
1.对接口编程而不是对实现编程
2.优先使用对象组合而不是继承