Mybatis獲取Connection


前幾次提到過DataSource是怎么生成的,這次看下是怎么獲取Connection,mybatis的是怎么實現的連接池的。
前面也說過在生成DefaultSqlSession的時候,會生成一個CachingExecutor,在CachingExecutor中會有個代理的Executor,如果不指定的話默認是SimpleExecutor,如圖1:
圖1
在看下CachingExecutor的構造函數,如圖2:
圖2
現在在CachingExecutor中的代理就是SimpleExecutor。
SimpleExecutor有個私有方法prepareStatement,如圖3:
圖3
這里就是獲取數據庫連接,這個getConnection方法是在父類BaseExecutor中,如圖4:
圖4
可以看到是通過Transaction來獲取Connection的,如圖5:
圖5
在Transaction是通過DataSource來獲取Connection的,這里DataSource在前面已經說過,所以不再說明了,如圖6:
圖6
可以看到調用了內部的popConnection方法,這個方法就是獲取Connection方法,並實現了線程池如圖7:
圖7(代碼太長,分幾次截圖)
這其中是通過PoolState來實現線程池,在PoolState中有兩個List,分別放入等待的連接和活躍的連接,如圖8:
圖8
如果還沒有生成過Connection的,或者活躍的Connection小於最大活躍數,就會生成一個Connection,如圖9:
圖9
這里的dataSource.getConnection就是標准的獲取Connection,就不展示了。
其余的就是各種判斷,判斷是否在idleConnections中Connection,如果有就直接獲取第一個;判斷第一個活躍的Connection查詢時間和設置的超時時間來獲取Connection,這里就不一一展示了。
 
接下來看下的是怎么歸還Connection到idleConnections中。
在不考慮整合其他連接池的情況下,單獨使用mybatis最后都是需要關閉SqlSession,其實說白了就是關閉Connection,那我們看下Connection在初始化的時候做了什么,如圖10:
圖10
能看到這里做了一個代理,自己代理自己,那直接看下代理的方法,如圖11:
圖11
在識別到close方法后會調用pushConnection方法,如圖12:
圖12
先獲取Connection,在放入PoolState的activeConnections中,用完了調用close方法,在放入PoolState的idleConnections。
 
下次在來看下mybatis內置的增刪改查。
 
如果有不對請指出,共同進步,謝謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM