Mybatis源碼之數據源模塊分析

先來看看java純jdbc查詢數據的示例:

try {//加載對應的驅動類Class.forName("com.mysql.cj.jdbc.Driver");//創建連接Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root123");String sql = "select * from t_user";//創建statementStatement createStatement = connection.createStatement();//利用statement執行SQL語句返回結果集ResultSet rs = createStatement.executeQuery(sql);//遍歷結果集while(rs.next()) {System.out.print(rs.getString(1) + " > ");System.out.print(rs.getString(2) + " > ");System.out.print(rs.getString(3) + " > ");System.out.println(rs.getString(4));}//關閉rs.close();createStatement.close();connection.close();
} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();
} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();
} 

這是一個最基礎的查詢數據的示例,也是所有的使用Java ORM框架與數據庫交互的底層,只不過是封裝一下罷了,但是像這種使用DriverManager創建連接的方式,已經基本淘汰了,在應用中是比較浪費資源的,所以JDK就提供一種數據庫連接池接口,供第三方組件實現,java.sql.DataSource,這個僅僅是個接口,具體的連接池的實現需第三方進行實現。

我們就直接先看一下Mybatis中的數據源連接池是怎么實現的。

設計模式

我們現需要了解一下數據源模塊中的設計模式

工廠模式(Factory Pattern)

是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。

在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象。

UML:

工廠模式的 UML 圖

但是這種工廠模式存在一定的弊端,比如在新增一個新業務模塊的時候,是必須修改創建工廠的代碼,違反了開閉原則

所以就有一種新澤設計模式,

抽象工廠模式(Abstract Factory Pattern)

是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。

在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

當業務擴展的時候新增擴展的工廠,無需修改工廠代碼,Mybatis的數據源模塊就是使用的抽象工廠設計模式。

源碼分析

在源碼中超級工廠如下:

package org.apache.ibatis.datasource;import java.util.Properties;import javax.sql.DataSource;/*** @author Clinton Begin*/
public interface DataSourceFactory {void setProperties(Properties props);DataSource getDataSource();}

設計的UML如下(一個工廠類對應只生產一種數據源):

JndiDataSourceFactory:是一個引用,可以直接獲取應用級容器中的上下文數據源。

UnpooledDataSourceFactory:生產UnpooledDataSource的數據源工廠,單一連接,非使用了數據源連接池。

PooledDataSourceFactory:生產PooledDataSource數據源工廠,提供了一個線程安全的數據源連接池。

UnpooledDataSource

雖說是繼承了DataSource但是并沒有具體的實現了連接池的特性,可以看一下這個是怎么產出Connection

跟開始那個JDBC連接數據庫的示例是一致的用法。

PooledDataSource

這個就是真正的數據源連接池的實現

連接池需要比較多的參數設置,比如超時,檢測連接是否有效,活動的連接,空閑連接等等。

所以今天就講講比較核心的一些東西:

里面創建連接是通過創建UnpooledDataSource對象來產出連接的,連接主要是存于List當中,然后配合一系列的操作就變成了線程安全的連接池了,

但是Mybatis的連接池的連接并非直接的使用的Connection而是使用的PooledConnection,進去發現這個是個連接代理,給真正的連接進行了代理增強

連接池釋放連接的過程

連接池獲取連接的過程(這個就比較長了)

這里用到了并發編程的知識,大家可以看看我之前發布的博文,有講解這一塊的東西

進行校驗后會將當前的線程添加到活動連接集合當中,

在獲取PooledConnection對象后,獲取的連接是代理的連接

解析基本結束了。

最后要提一下為什么在JDBC中使用連接只要用DriverManager.getConnection就能獲取連接了,

因為在Class.forName("")加載的時候會去加載驅動類的靜態代碼塊,將其驅動放到registeredDrivers集合中,這個是個CopyOnWriteArrayList讀寫分離集合

然后在DriverManager獲取連接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

reactnative 獲取定位_[RN] React Native 獲取地理位置

import React, {Component} from react;import {StyleSheet, Text, View}from react-native;exportdefault classTestGeo extends Component {state{longitude:,//經度latitude: ,//緯度city: ,district:,street:,position:,//位置名稱};componentWillMount () >{this.getPo…

第二沖刺階段第三天

查閱資料,修改控件界面轉載于:https://www.cnblogs.com/gyy0/p/10066452.html

Mybatis源碼之緩存模塊分析

緩存這個東西在很多應用中都能看到它們的身影,這次就講講在Mybatis中的緩存是怎么應用的,雖然說吧Mybatis中的緩存基本不怎么用,用的更多是第三方組件redis、MongoDB、MemCache等等。 Mybatis的緩存是基于Map實現的,從緩存中讀寫…

Mybatis源碼之核心流程分析

終于談到了Mybatis最核心的東西了,最核心的就是通過配置XML文件或注解中的SQL,直接調用接口就能執行配置好的SQL語句并封裝成對應的返回類型的數據。 先看一下Mybatis使用示例: //創建Builder對象 SqlSessionFactoryBuilder builder new S…

mimakatz用法_兩步完成利用procdump64+mimikatz獲取win用戶密碼

使用procdump64mimikatz可實現從內存中獲取明文密碼工具鏈接:https://pan.baidu.com/s/1gNc9qLcNSNBohIVrAiqShw 密碼:fc38首先得先獲取到內存文件lsass.exe進程, 它用于本地安全和登陸策略,一般在進程管理器中能看到, 比如這樣1.導出lsass.exeprocdump6…

ios app提交之前需要哪幾個證書

1、遇到的問題 一款App在別人的機器上開發和發布,現在迭代更新和開發需要在一臺新mac機上開發和發布。(使用同一個開發者賬號)問題: 1.在新mac機器上開發并導入真機測試,是不是需要從別人的機器上面導處開發者證書、開…

Mybatis源碼之與Spring集成包

這次講講Mybatis與Spring的整合&#xff0c;作為兩款優秀的開源框架&#xff0c;被大眾廣泛使用&#xff0c;自然是需要強強聯合的。 使用示例 先看一下怎么使用&#xff0c;首先需要引用這兩款框架的jar包&#xff1a; <dependency>//spring-webmvc會自動去引入其他S…

hadoop主節點切換_hadoop2.0 HA的主備自動切換

在《hadoop2.0 QJM方式的HA的配置》一文中介紹了HA的配置&#xff0c;是通過手工進行主備切換的。本文在這基礎上&#xff0c;繼續介紹HA的主備自動切換(automatic failover)的配置。自動切換是通過配置zookeeper來實現的&#xff0c;關于zookeeper的安裝和配置&#xff0c;在這…

Mybatis源碼之插件模塊分析

總結完這個Mybatis的整體主要功能基本上就差不多完&#xff0c;還有一些細節的部分&#xff0c;后續都會記錄補充。 插件這個東西一般用的比較少&#xff0c;就算用的多的插件也算是PageHelper分頁插件&#xff1b; PageHelper官網&#xff1a;https://github.com/pagehelper…

AMD推出7nm高端顯卡Radeon VII,直指英偉達RTX 2080

顯卡戰爭已經發展到了2019年&#xff0c;并且變得比任何人預想的都要激烈。 CES 2019大會上&#xff0c;AMD發布了第一款消費級的 7nm GPU&#xff0c;取名&#xff1a;Radeon VII。據了解&#xff0c;這不是 AMD 的第一顆 7nm 處理器&#xff08;早期以 AI 運算為主的 Radeon …

電子繪本pdf_【孩子必看的】20本世界著名英文繪本 | PDF電子版+MP3音頻

原標題&#xff1a;【孩子必看的】20本世界著名英文繪本 | PDF電子版MP3音頻2 —6歲年齡段的孩子&#xff0c;自我意識逐漸萌芽&#xff0c;已經明白書是一種“特殊”的玩具&#xff0c;不在撕書、咬書、把書搬來搬去。這個階段他們記憶力超強&#xff0c;唐詩、三字經啥的&…

Spring集成Mybatis多數據源配置

既然在整理Mybatis那就把經常用的這個多數據源的筆記也整一下吧。 Spring集成Mybatis在之前就已經提到了。Spring集成Mybatis 集成Mybatis多數據源有兩種方式&#xff1a; 1、創建多個SqlSessionFactory&#xff0c;掃描每個SqlSessionFactoryBean對應的包&#xff0c;形成了…

Spring文件上傳

2019獨角獸企業重金招聘Python工程師標準>>> Spring文件上傳 1、所需依賴包&#xff1a;commons-fileupload-1.3.1.jar2、Maven配置文件pom.xml文件中加入依賴Jar包<dependency><groupId>commons-fileupload</groupId><artifactId>commons-…

中英離線翻譯mac_Instant Translate for Mac-即時翻譯Mac版下載 V1.3.0-PC6蘋果網

即時翻譯(Instant Translate)Mac版是一款Mac平臺的翻譯及辭典軟件&#xff0c;Instant Translate支持90的語言互翻譯&#xff0c;通過ControlS切換語言&#xff0c;并且支持發音功能&#xff0c;并且支持自動檢測語言并進行翻譯。軟件特色Instant Translate的主要特點&#xff…

基于Zookeeper使用ZkClient實現分布式鎖

有段時間沒寫博客了&#xff0c;在整理之前寫過的一套自定義框架&#xff0c;并且整理好上傳值github上了&#xff0c;也有一些新功能還在開發&#xff0c;歡迎大家使用&#xff1a;一個好用的Http接口請求工具組件 可能今天這篇文章跟之前的比有些跳躍性&#xff0c;一下子就…

算法題學到的一些小語言細節

1.要學會用i&#xff1b;可以簡化很多代碼&#xff1a;i&#xff1b;copyFromMe(i)&#xff1b;可以寫成&#xff1a;copyFromeMe(i) 2.StringBuffer也跟列表一樣有append函數&#xff1b; 3.if語句是分支不能進行循環&#xff0c;要寫成while才能替代循環里面的判斷 4. 這里的…

android 按鈕帶圖標 陰影_android中帶圖標的按鈕(ImageButton)怎么用

展開全部除了Android系統自帶的Button按鈕以外&#xff0c;還提供了帶圖標的按鈕ImageButton要制作帶圖標的按鈕&#xff0c;首先要在布局62616964757a686964616fe58685e5aeb931333337613163文件中定義ImageButton&#xff0c;然后通過setImageDrawable方法來設置要顯示的圖標。…

Zookeeper基礎常用操作以及ACL權限

這次將Zookeeper的一些基礎用法以及權限這塊的都補充一下在這篇博客中。 上篇博客介紹了基于ZooKeeper實現的分布式鎖&#xff0c;也介紹了一些ZooKeeper的節點類型以及監聽機制&#xff0c;今天這里就不作過多的介紹了&#xff0c;大家也可以自行的去官方文檔上看看更具體的介…

[中醫經絡學習一]足陽明胃經

人體有六臟&#xff08;心、肝、脾、肺、腎五臟&#xff0c;再加心包&#xff09;六腑&#xff08;胃、小腸、大腸、膀胱、膽、三焦&#xff09;&#xff0c;每個臟腑都聯接著一條經絡&#xff0c;一共12條經絡&#xff0c;稱“十二正經”&#xff0c;經絡的走向在四肢兩側基本…

ThreadLocal原理解析以及是否需要調用remove方法

平常的開發過程中&#xff0c;如果有個類不是線程安全的&#xff0c;比如SimpleDateFormat&#xff0c;要使這個類在并發的過程中是線程安全的&#xff0c;那么可以將變量設置位局部變量&#xff0c;不過存在的問題就是頻繁的創建對象&#xff0c;對性能和資源會有一定降低和消…