1.什么是線程池?
線程池就是事先將創建好的線程進行整合,當需要使用的時候,直接拿出來進行使用,不用現去創建,可以節約開辟的時間,提高效率。
2.線程池有哪些種類?
在java.util.concurrent.Executors包中提供了許多靜態方法。
Executors.newsingleThreadPool? 單例線程池
Executors.newFixedThreadPool? 定長容量的線程池
Executors.newSechodedThreadPool 執行周期任務的線程池
Executors.newCachedThreadPool 可緩存線程池
3.線程池的工作原理
當首次進行execute提交任務時,才會去創建線程。首先是由核心線程來執行。當核心線程都被使用時,會進入等待隊列中進行緩存,當等待隊列中滿了后,就會由救急線程來進行執行。當前方都滿了,就會執行拒絕策略,默認是拋出一個異常。
4.線程池的核心參數
corePoolSize 核心線程數? ?
maxmumPoolSize 最大線程數? ?核心+救急
workQure 等待隊列????????????????? ? keepAliveTime? 救急線程生存時間
unit 時間單位? ? ? ? ? ? ? ? ? ? ? ? ? ? ? unit? ?時間單位
threadFactory 線程工廠? ? ? ? ? ? ?workQueue? 等待隊列
handleExecutor 拒絕策略? ? ? ? ? ThreadFactory? 線程工廠
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? handler? ?拒絕策略
5.springmvc的工作流程
用戶發送請求,dispatcherservlet前端控制器進行接收,它屬于一個調度中心。調用handlemapping處理器映射器,返回一個handleExecutorchain對象,它里面就是包含了一個controller對象。返回給dispatcherServlet。再次調用handleadptor,處理器適配器,將處理器包裝為適配器,他會找到對應的controller進行邏輯執行,返回一個modelandview對象給前端控制器。如果先后端不分離,就會調用viewresover試圖解析器,將對象解析為view對象,將mode數據渲染到試圖上,然后返回。先后端分離,就可以直接responsebody返回json數據給前端。
6.springmvc常用的注解,spring........注解
@RestController
@Service
@Mapper
@Autowired
@SpringBootApplication
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PathVarible
@RequestParam
@Param
@Aspect
@Around .....
@Bean
@Configuration
@Data
@Sl4J
@Component
7.spring中bean的生命周期
0 首先要對bena的基本信息進行封裝,bean的全部信息封裝為一個beanDifination對象
1 調用構造方法,進行實例化
2 set注入,依賴注入,常用的autowired就是這一步
3 aware結尾的接口是否實現,如果實現就要重新方法
4 beanPostProcossor before 前置處理器
5.是否自定義init方法,是否實現initiatingIiitialingBean接口,是否使用beanConstruct@PostContruct注解
6.beanPostProcossor after前置處理器的后置處理器,此處對bean進行增強,可以產生代理對象。 CGlib代理對象
7.銷毀
8.spring中事務是怎么實現的
aop實現,在調用方法前開啟事務,對方法前后進行攔截,try catch 一下,執行后,如果拋出運行時異常,進進行回滾,無異常提交。
9.spring中事務失效的場景
1.默認只會處理運行時異常,會對運行時異常進行捕獲。如果出現異常自己進行catch處理后,也要拋出運行時異常
2.拋出檢索異常檢查異常,要想進行回滾,可以設置注解的rebackFor 為 Exception.class
3.方法前要使用public修飾。
10.spring中的bean是線程安全的嗎?
不是安全的。如果說bean是無狀態的那就是安全的。所謂無狀態就是他的成員沒有被修改,那么注入這種無狀態的bean,就是線程安全的。所以就是說某種程度上來說是安全的。
不安全的時候,如果在bean中定義了可修改的成員變量,可以scope改變bean的模式有singlton改為prototype多例的。或者自己加鎖實現。
11.什么事aop,是否使用過?
aop是面向切面編程,把公共代碼進行抽離方便復用,且可以不改變原代碼邏輯。
使用過,例如使用的事務底層就是aop實現。或者記錄操作日志
使用切點表達式+環繞通知,也可以自定義注解切點表達式可以使用路徑名或者自定義注解。可以獲取到很多參數,例如:入參,類名,方法名,返回值,注解,請求方式,信息等
12.springboot自動配置的原理
我們在啟動項目時會實例化bean交給springioc容器進行管理。所以就和啟動項很密切,就要說到啟動類的注解@SpringbootApplication注解。它封裝了3個注解。@SpringBootConfiguration這個注解內部其實就是封裝了@Configuration注解,標明這就是一個配置類。@ComponentScan注解就是包掃描,不重寫的話,默認就是當前類下及其子包下都會掃描到,掃描哪些@Component注解的類,交給容器來管理。@Enable開頭的注解,這個注解往往都和第三方的技術關聯性很大。它里面封裝了@Import注解,這個注解的參數有三種。.class,配置類,importSeletor接口實現類。在源碼中是接口實現類這種。實現類中有個方法selectImports()方法,返回值是String[]數組,他會將一個文件轉換為String數組,這個文件包含的就是第三方的依賴的全限定類名。要將這些類交給ioc容器來管理,但不是所有的bean都會被加載,因為有一些conditoinal修飾的,他會根據條件進行裝配(環境中是否有class文件、是否有對應的bean、是否有對應的屬性和值)。這個文件在mate-inf下的spring.factory文件和spring下有個import結尾的文件。
13.springboot中定時任務。
@Secheduled注解
14.springboot打成的jar包和普通的jar包的區別
打成的jar包是可以java -jar進行運行的。而普通的jar包時可以進行引用的,文件和包名一樣。
15.RequestMapping和GetMapping的區別
他們功能很相似,可以說getmapping是requestmapping的特例,getmapping更具有語義化。
16.Springboot中的run方法做什么了?
IOC初始化的操作。
17.spring、springmvc、springboot的區別
spring有兩大核心 di依賴注入 ioc控制反轉目的:解耦。mvc的特點就是適合快速搭建web項目,利用dispatchservlet,modelandview,viewResolver一些簡單的概念,來簡化web開發 。springboot的特點是自動裝配starter啟動項,利用這兩項來簡化大量配置,快速構建項目,簡化開發,簡話配置代碼,約定大于配置。
18.循環引用(循環依賴)講解一下?具體?
兩個bean相互引用,形成閉環,當然3個也行,1個也行。
絕大多說的循環依賴都可以由三級緩存來解決。
一級緩存:存放生命周期已經走完的bean。單利池
二級緩存:生命周期沒有走完的半程bena。
三級緩存:一個bean的工程,可以生產代理對象和正常bean對象。ObjectFactories對象工廠
?一級緩存+二級緩存就可以解決普通對象的循環依賴。
三級的出現,是為了解決代理對象的出現。這三級緩存可以解決大部分循環依賴(主要是bean生命周期中構造一下的循環引用)
19.如何實現的?
場景:A引用B,B引用A。
A首先進行實例化,原始對象A會生成一個ObjectFactories對象放入三級緩存。在實例化的過程中,需要依賴B對象,這時候就會把A放入三級緩存中。接著走B的邏輯,因為此時B不存在,所以B進行實例化,原始B會生成一個ObjectFactories對象放入三級緩存,B又需要依賴A,這時候就會到三級緩存中,由beanFactory生產A對象,此時可以是代理對象,接著把A放入二級緩存中。接著走B的邏輯,將A注入給B,B就可以初始化完成B創建成功,就會把B放入到一級緩存中。接著走A的邏輯,因為B已經初始化完成,所以A就可以直接引用B,來完成初始化,接著把A放入一級緩存中。接著將二級緩存中的B進行刪除。
20.構造方法中出現循環引用,怎么辦?
但是三級緩存解決不了構造方法中的引用。此時就需要使用@Lazy注解,懶加載,當什么時候用到,什么時候再進行加載。
21.如何定位慢查詢?
可以使用mysql自帶的explain來查看是否具有進一步的優化空間。 type、key、key_len等等
mysql中開啟慢日志查詢(一般調試階段,接口設置為2秒響應)
當然也可以使用運維工具,檢測接口的運行時長。
22.sql語句執行很慢,如何分析?
看是否命中索引,索引是否生效。key 和 key_len
看type是否有進一步優化的空間。 是否存在全盤掃描/全索引掃描
通過extra判斷是否有回表情況。? 如果出現回表,可以添加索引或修改返回字段來修復。其實就是覆蓋索引。
索引這有機會再理解一下。
23.什么是索引?
是一種快速檢索的數據機構,提高檢索效率,采用的是B+樹,這種樹,層數低路徑短,階數高多,是一種矮胖的樹
24.底層的數據結構是什么樣的?
飛葉子節點存儲指針,葉子節點存儲數據。而且便于掃庫區間掃描,因為葉子節點采用雙向鏈表,可以快速檢索。
25.什么是回表查詢?
說到回表,就需要直到聚簇索引和非聚簇索引,聚簇索引指他的非葉子節點存儲指針數據和索引放在一起,葉子節點存儲的是整行的數據。非聚簇索引,索引和數據分開發非葉子節點存儲的是整行數據的id。而回表指不能一次查詢出結果,需要先進行非聚簇索引查出id,再有id查出聚簇索引的整行數據。
26.什么是聚簇索引?什么是非聚簇索引?
上方已經解釋。
27.什么是覆蓋索引?
所謂覆蓋索引就是指可以不用回表就可以查出的數據,因為返回的數據中在索引中已經全部包含了。
28.索引的創建原則,什么情況使用?
數據量大30萬,效果比較明顯。
數據量大,查詢頻繁的表
連接條件,where,order group的字段
如果字符串必須是索引可以采用前綴索引。
區分度高的字段。
也要控制索引的數量,并不是越多越好,維護起來成本比較大。
盡量使用聯合索引?
如果字段不為空,可以加非空約束,添加約束。
29.mysql超大分頁怎么處理?
采用覆蓋索引+子查詢。
30.什么情況下,索引失效?
首先違背最左原則。1,12,123,正常的。13只有1會執行,23都不會執行。
索引不能使用函數。
索引模糊查詢? ?只有后%是好使的。
>= 這種范圍查詢 右邊不能使用索引
字符串索引,不加'',造成索引失效。(類型轉換異常)
31.事務的特性?
原子性、事務是最小操作單元,要么同時成功同時失敗
一致性、
隔離性、不會受別的事務影響
持久性
32.并發事務會帶來哪些問題?
臟讀、不可重復讀、幻讀、
33.如何解決這個問題?
讀未提交,讀已提交、重復度、序列化
改變事務的隔離級別,默認是可重復度。但是解決不了幻讀。需枷鎖處理。
34.Mybatis的執行流程?
不太會。
1.讀取MyBatis配置文件:mybatis-config.xml 加載運行環境和映射關系。
2.構造會話工程sqlSessionFactory,一個項目只有一個,是單例的,一般由spring管理
3.會話工廠創建sqlSession對象,包含了執行sql語句的所有方法。
4.操作數據庫的接口,Executor執行器,同時負責查詢緩存的維護。
5.Executor接口的執行方法中有一個MappedStatement類型的參數,封裝了映射信息
6.輸入參數映射? ?java -> 數據庫
7.輸出結果映射? 數據 -> java
35.git指令?
git init
git clone
git remote add origin 地址
git push --set-upstream master
git checkout -b 分支名
git checkout 分支名
git pull = git fetch + git merge
git push
git push origin master
git status
git-log
git reset --hard commitId