JDBC知識點筆記

  • 雙親委派模型,加載DriverManger時需要掃描所有Driver實現類,會找不到Driver實現類,
    此時基於SPI原理會從線程上下中拿到AppClassloader,
    然後從appclassloader中獲取driver實現類,封裝成driverInfo,加入registry到DriverManager.這些實現需要SPI接口和service聲明文件的支持。

  • 如果不希望破壞雙親委派模型,則需要用class.forname先主動加載驅動類,然後加載drivermanager,再將driver註冊到drivermanager中。

  • 獲取鏈接既不能所有請求處理線程共享,又不能每次執行SQL都創建connector浪費資源。因此,採用統一線程共享一個connector的方案,用map作緩存,用線程ID作key,自然就想到用threadlocal了。

  • connector在同一個線程的緩存功能時JDBC底層實現的,他通過對getConnector()方法進行判斷,如果threadlocal有就不會再重新創建鏈接了。對於JDBC的用戶來說時感知不到這個操作的。這裏的用戶可以是開發者也可以是mybatis框架,比如sqlsession…openConnector就是調用了JDBC的getConnector().

  • 當然sqlsession.openConnector有時候也會去調用連接池,從而獲取鏈接,而不是直接訪問JDBC,這相當於給JDBC作了一層代理緩存,進一步減少了鏈接創建的開銷。

  • 對於同一個線程來說,仍然獲得的是同一個鏈接

  • 由於threadlocal在底層JDBC作了聲明,所以無論在哪裏,線程都能獲得這個鏈接,
    因此大多數連接池調用getConnector時都會優先去threadlocal中獲取,當取不到的時候,纔會考慮從連接池去獲取,這是一個很容易忽略的細節。
    這個細節的好處,就是減少連接池的壓力,而且又遵循了jdbc優良的緩存習慣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章