天天看點

java 同一個事物 先更新再查詢_Java架構面試題

java 同一個事物 先更新再查詢_Java架構面試題

Spring Bean作用域差別

  • 使用scope指定bean的作用于
屬性 介紹
singleton

預設值,當IOC容器一建立就會建立bean的執行個體,

是單例的,每次得到的都是同一個

propotype

原型的,當IOC容器建立時不建立bean,

每次調用getBean方法時再執行個體化bean,而且不是同一個

request 在web環境中使用,每次HTTP請求執行個體化一個bean
session 在web環境中使用,在一個HTTP Session會話中共享一個bean

Spring常用資料事物傳播屬性和事務隔離級别

事物的屬性

Propagation:用來設定事物的傳播行為

  • 傳播行為:一個方法運作在一個開啟事物的方法中,目前方法是使用原來的事務還是開啟一個新的事物
  • Propagation.REQUIRED:預設值,使用原來的事物
  • Propagation.REQUIRES_NEW:将原來的事物挂起,使用新的事物

事物的隔離級别

Isolation:用來設定事物的隔離級别

  • Isolation.REPEATABLE_READ:可重複讀,MySql的預設隔離級别
  • Isolation.READ_COMMITTED:讀已送出,Oracle的預設隔離級是

Spring的生命周期

  • 執行個體化,初始init,接收請求service,銷毀destroy
  1. 執行個體化一個Bean,等同于new
  2. 按照Spring上下文對執行個體化的Bean進行配置,也就是IOC注入
  • 如果這個Bean已經實作了BeanNameAware接口,會調用它實作的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值
  • 如果這個Bean已經實作了BeanFactoryAware接口,會調用它實作的setBeanFactory(setBeanFactory(BeanFactory))傳遞的是Spring工廠自身(可以用這個方式來擷取其它Bean,隻需在Spring配置檔案中配置一個普通的Bean就可以)
  • 如果這個Bean已經實作了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實作步驟4的内容,但比4更好,因為ApplicationContext是BeanFactory的子接口,有更多的實作方法)
  • 如果這個Bean關聯了BeanPostProcessor接口,将會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean内容的更改,并且由于這個是在Bean初始化結束時調用那個的方法,也可以被應用于記憶體或緩存技術

如果Bean在Spring配置檔案中 配置了init-method屬性會自動調用其配置的初始化方法如果這個Bean關聯了 BeanPostProcessor接口,将會調用postProcessAfterInitialization(Object obj, String s)方法當Bean不再需要時,會經過清理階段,如果 Bean實作了DisposableBean這個接口,會調用那個其實作的destroy()方法最後,如果這個Bean的Spring配置中配置了destroy-method屬性, 會自動調用其配置的銷毀方法

@Autowired和@Resource差別

  • @Autowired注解是按類型裝配依賴對象,預設情況下它要求依賴對象必須存在,如果允許null值,可以設定它required屬性為false
  • @Resource注解是按名稱裝配,稱可以通過@Resource的name屬性指定
  • @Resources按名字,是JDK的,@Autowired按類型,是Spring的

MyBatis資料庫字段名和屬性名不一緻解決

  1. 寫sql語句的時候起别名
  2. 在MyBatis的全局配置檔案中開啟駝峰命名
  3. 在Mapper檔案中使用resultMap自定義映射規則

MyBatis的一級緩存和二級緩存

  • Mybatis的一級緩存首先去緩存中查詢結果集,作用域是一個SqlSession,如果沒有則查詢資料庫,如果有則從緩存取出傳回結果集就不走資料庫。
  • Mybatis内部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句,value為從查詢出來映射生成的java對象
  • Mybatis的二級緩存即查詢緩存,作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中擷取資料,二級緩存是可以跨SqlSession的

Git分支相關指令

建立分支

  • git branch
  • 檢視分支:git branch -v

切換分支

  • git checkout
  • 一步完成建立和切換分支:git checkout -b

合并分支

  • 先切換到主幹:git checkout master
  • git merge

删除分支

  • 先切換到主幹:git checkout master
  • git branch -D

工作流應用

java 同一個事物 先更新再查詢_Java架構面試題

git工作流

Redis持久化有幾種類型和差別

RDB

  • 在指定的時間間隔内将記憶體中的資料集快照寫入磁盤,類似于Snapshot快照,恢複資料的時候是直接将快照直接讀到記憶體中
  • 執行流程:Redis會單獨建立一個子程序來進行持久化,會先将資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案,RDB比AOF更高效,但最後一次持久化後的資料可能會丢失
  • 優點:節省磁盤空間,恢複速度快
  • 缺點:資料龐大時消耗性能

AOF

  • 以日志的形式記錄每個寫操作,将Redis執行過的指令記錄下來,追加到檔案不改寫檔案,Redis重新開機後就根據日志的内容将寫指令從前到後執行一次恢複資料
  • 優點:備份機制穩健,丢失資料機率低
  • 缺點:比RDB更占用磁盤空間,恢複備份速度慢,存在個别Bug

Redis在項目中的使用場景

資料類型 使用場景
String 比如封鎖某個IP位址時可以使用
Hash 存儲使用者資訊的時候
List 實作最新消息的排行,可以模拟消息隊列
Set 可以自動排重,求共同交集的時候使用
Zset 進行排序的時候可以使用

MySQL索引

索引介紹

  • 索引是資料結構
  • 索引是幫助MySQL高效擷取資料的資料結構
  • 索引是以索引檔案的形式存儲在磁盤上

那些情況需要索引

  • 主鍵自動建立唯一索引
  • 頻繁作為查詢條件的字段應該建立索引
  • 查詢中于其他表關聯的字段,外鍵關系建立索引
  • 組合索引比單鍵索引效率更高
  • 查詢中排序的字段
  • 查詢中統計或者分組的字段

那些情況不需要索引

  • 表記錄太少
  • 經常增删改的表或者字段
  • Where條件裡用不到的字段
  • 過濾性不好的不适合建索引

單點登入的實作過程

介紹

  • 單點登入:一處登入多處使用
  • 前提:單點登入多使用在分布式系統中

實作

java 同一個事物 先更新再查詢_Java架構面試題

單點登入的實作過程

購物車實作過程

使用者和購物車的關系

  • 一個使用者必須對應一個購物車
  • 單點登入操作在購物車之前

購物車操作

  1. 添加購物車
  • 使用者未登入将資料添加到Redis或者Cookie中
  • 使用者登入後用Hash存儲到Redis和資料庫中

展示購物車

  • 未登入的時候直接從Redis或Cookie中展示資料
  • 登入後,必須從資料庫和Redis和Cookie中展示購物車中的資料

消息隊列

弊端

  • 容易出現消息的不确定性
  • 可以使用延遲隊列和輪詢技術解決
java 同一個事物 先更新再查詢_Java架構面試題
java 同一個事物 先更新再查詢_Java架構面試題
java 同一個事物 先更新再查詢_Java架構面試題
java 同一個事物 先更新再查詢_Java架構面試題

END

往期推薦

  • Java基礎面試題
  • RocketMQ整合SpringBoot
  • Solr整合SpringBoot
  • WebSocket整合SpringBoot
  • Java多線程