欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis配置之<environments>配置元素詳解

 更新時間:2022年01月26日 08:58:34   作者:DreamMakers  
這篇文章主要介紹了Mybatis配置之<environments>配置元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在這篇文章中,我們接著前文繼續(xù)往下看其他的配置元素,今天的主角就是我們的<environments>元素,該元素用于對我們需要訪問的數(shù)據(jù)庫配置進(jìn)行設(shè)置,

我們先來看一下配置

<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事務(wù)管理 -->
			<transactionManager type="JDBC" />
			<!-- 數(shù)據(jù)庫連接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
</environments>

從上面看,我們知道<environments>下面可以配置多個<environment>元素節(jié)點(diǎn),而每個<environment>節(jié)點(diǎn)我們可以配置兩個東西,一個是事務(wù)管理器配置<transactionManager>,另一個是數(shù)據(jù)源配置<dataSource>。

我們先從源碼開始看起,看看這塊是怎么解析的,然后再具體看里面都要配置什么哪些參數(shù)。

還是從解析的入口開始看起

進(jìn)入方法內(nèi)部

從代碼看,就是首先獲取<environments>標(biāo)簽元素的default屬性,這個屬性作用就是指定當(dāng)前情況下使用哪個數(shù)據(jù)庫配置,也就是使用哪個<environment>節(jié)點(diǎn)的配置,default的值就是配置的<environment>標(biāo)簽元素的id值。

正如上面代碼中isSpecifiedEnvironment(id)方法一樣,在遍歷所有<environment>的時候一次判斷相應(yīng)的id是否是default設(shè)置的值,如果是,則使用當(dāng)前<environment>元素進(jìn)行數(shù)據(jù)庫連接的初始化。

isSpecifiedEnvironment方法如下所示

緊接著,下面的代碼就是用設(shè)置的事務(wù)管理器和數(shù)據(jù)源構(gòu)造相應(yīng)的對象了。

TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
DataSource dataSource = dsFactory.getDataSource();
Environment.Builder environmentBuilder = new Environment.Builder(id)
              .transactionFactory(txFactory)
              .dataSource(dataSource);
configuration.setEnvironment(environmentBuilder.build());

我們首先從事務(wù)管理器的解析開始,進(jìn)入到transactionManagerElement()方法內(nèi):

private TransactionFactory transactionManagerElement(XNode context) throws Exception {
    if (context != null) {
      String type = context.getStringAttribute("type");
      Properties props = context.getChildrenAsProperties();
      TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();
      factory.setProperties(props);
      return factory;
    }
    throw new BuilderException("Environment declaration requires a TransactionFactory.");
  }

我們可以看到,這里其實(shí)是根據(jù)<transactionManager>這個元素的type屬性來找相應(yīng)的事務(wù)管理器的。

在Mybatis里面支持兩種配置:JDBC和MANAGED。這里根據(jù)type的設(shè)置值來返回相應(yīng)的事務(wù)管理器。我們看下,在Mybatis的Configuration類中,已經(jīng)將這兩種配置及對應(yīng)的事務(wù)管理器做了某種關(guān)聯(lián),如下所示:

public Configuration() {
    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
 
    typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
    typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
    typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
 
    typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);
    typeAliasRegistry.registerAlias("FIFO", FifoCache.class);
    typeAliasRegistry.registerAlias("LRU", LruCache.class);
    typeAliasRegistry.registerAlias("SOFT", SoftCache.class);
    typeAliasRegistry.registerAlias("WEAK", WeakCache.class);
 
    typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);
 
    typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);
    typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);
 
    typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
    typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);
    typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
    typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
    typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
    typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
    typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);
 
    typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);
    typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);
 
    languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
    languageRegistry.register(RawLanguageDriver.class);
  }

這兩種事務(wù)管理器的區(qū)別

  • JDBC:這個配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)作用域。
  • MANAGED:這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務(wù)的整個生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。 默認(rèn)情況下它會關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設(shè)置為 false 來阻止它默認(rèn)的關(guān)閉行為。

例如:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

備注:如果你正在使用 Spring + MyBatis,則沒有必要配置事務(wù)管理器, 因?yàn)?Spring 模塊會使用自帶的管理器來覆蓋前面的配置。

說完了事務(wù)管理器,緊接著,我們來看看數(shù)據(jù)源配置。

dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。Mybatis支持三種內(nèi)建的數(shù)據(jù)源類型,分別是UNPOOLED、POOLED和JNDI,即我們在配置<dataSource>元素的type屬性時,我們可以直接支持設(shè)置這三個值。

下面分別對這三種類型做一個簡單的說明

(1)UNPOOLED

這個數(shù)據(jù)源的實(shí)現(xiàn)只是每次被請求時打開和關(guān)閉連接。雖然一點(diǎn)慢,它對在及時可用連接方面沒有性能要求的簡單應(yīng)用程序是一個很好的選擇。

不同的數(shù)據(jù)庫在這方面表現(xiàn)也是不一樣的,所以對某些數(shù)據(jù)庫來說使用連接池并不重要,這個配置也是理想的。

UNPOOLED 類型的數(shù)據(jù)源僅僅需要配置以下 5 種屬性:

  • driver:這是 JDBC 驅(qū)動的 Java 類的完全限定名(并不是JDBC驅(qū)動中可能包含的數(shù)據(jù)源類)。
  • url:這是數(shù)據(jù)庫的 JDBC URL 地址。
  • username:登錄數(shù)據(jù)庫的用戶名。
  • password:登錄數(shù)據(jù)庫的密碼。
  • defaultTransactionIsolationLevel:默認(rèn)的連接事務(wù)隔離級別。

作為可選項(xiàng),你也可以傳遞屬性給數(shù)據(jù)庫驅(qū)動。要這樣做,屬性的前綴為“driver.”,例如:driver.encoding=UTF8

這將通過DriverManager.getConnection(url,driverProperties)方法傳遞值為 UTF8 的 encoding 屬性給數(shù)據(jù)庫驅(qū)動。

(2)POOLED

這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對象組織起來,避免了創(chuàng)建新的連接實(shí)例時所必需的初始化和認(rèn)證時間。 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請求的流行處理方式。

除了上述提到 UNPOOLED 下的屬性外,會有更多屬性用來配置 POOLED 的數(shù)據(jù)源:

  • poolMaximumActiveConnections:在任意時間可以存在的活動(也就是正在使用)連接數(shù)量,默認(rèn)值:10
  • poolMaximumIdleConnections:任意時間可能存在的空閑連接數(shù)。
  • poolMaximumCheckoutTime:在被強(qiáng)制返回之前,池中連接被檢出(checked out)時間,默認(rèn)值:20000 毫秒(即 20 秒)
  • poolTimeToWait:這是一個底層設(shè)置,如果獲取連接花費(fèi)的相當(dāng)長的時間,它會給連接池打印狀態(tài)日志并重新嘗試獲取一個連接(避免在誤配置的情況下一直安靜的失?。?,默認(rèn)值:20000 毫秒(即 20 秒)。
  • poolPingQuery:發(fā)送到數(shù)據(jù)庫的偵測查詢,用來檢驗(yàn)連接是否處在正常工作秩序中并準(zhǔn)備接受請求。默認(rèn)是“NO PING QUERY SET”,這會導(dǎo)致多數(shù)數(shù)據(jù)庫驅(qū)動失敗時帶有一個恰當(dāng)?shù)腻e誤消息。
  • poolPingEnabled:是否啟用偵測查詢。若開啟,也必須使用一個可執(zhí)行的 SQL 語句設(shè)置 poolPingQuery 屬性(最好是一個非??斓?SQL),默認(rèn)值:false。poolPingConnectionsNotUsedFor : 配置 poolPingQuery 的使用頻度。這可以被設(shè)置成匹配具體的數(shù)據(jù)庫連接超時時間,來避免不必要的偵測,默認(rèn)值:0(即所有連接每一時刻都被偵測 — 當(dāng)然僅當(dāng) poolPingEnabled 為 true 時適用)。

(3)JNDI

這個數(shù)據(jù)源的實(shí)現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。

這種數(shù)據(jù)源配置只需要兩個屬性:

  • initial_context:這個屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那么 data_source 屬性將會直接從 InitialContext 中尋找。
  • data_source:這是引用數(shù)據(jù)源實(shí)例位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進(jìn)行查找,沒有提供時則直接在 InitialContext 中查找。

和其他數(shù)據(jù)源配置類似,可以通過添加前綴“env.”直接把屬性傳遞給初始上下文。比如:env.encoding=UTF8

這就會在初始上下文(InitialContext)實(shí)例化時往它的構(gòu)造方法傳遞值為 UTF8 的 encoding 屬性。

至此,關(guān)于<environments>元素的相關(guān)配置使用便介紹完畢了。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用jenkins配置maven和JDK

    使用jenkins配置maven和JDK

    這篇文章主要介紹了使用jenkins配置maven和JDK問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法

    Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法

    本篇文章主要介紹了Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java多線程——基礎(chǔ)概念

    Java多線程——基礎(chǔ)概念

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下,希望可以幫到你
    2021-07-07
  • Spring Boot實(shí)現(xiàn)分布式鎖的自動釋放的示例代碼

    Spring Boot實(shí)現(xiàn)分布式鎖的自動釋放的示例代碼

    在實(shí)際開發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統(tǒng)來實(shí)現(xiàn)分布式鎖,本文將介紹如何使用 Spring Boot 來實(shí)現(xiàn)分布式鎖的自動釋放,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • 詳解Java中hashCode的作用

    詳解Java中hashCode的作用

    這篇文章主要介紹了詳解Java中hashCode的作用的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 三分鐘帶你掌握J(rèn)ava開發(fā)圖片驗(yàn)證碼功能方法

    三分鐘帶你掌握J(rèn)ava開發(fā)圖片驗(yàn)證碼功能方法

    這篇文章主要來為大家詳細(xì)介紹Java實(shí)現(xiàn)開發(fā)圖片驗(yàn)證碼的具體方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • 基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    這篇文章主要介紹了基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Spring?MVC請求處理流程和九大組件詳解

    Spring?MVC請求處理流程和九大組件詳解

    這篇文章主要介紹了Spring?MVC請求處理流程和九大組件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Spring的refresh()方法相關(guān)異常解析

    Spring的refresh()方法相關(guān)異常解析

    這篇文章主要介紹了Spring的refresh()方法相關(guān)異常解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot用配置影響B(tài)ean加載@ConditionalOnProperty

    SpringBoot用配置影響B(tài)ean加載@ConditionalOnProperty

    這篇文章主要為大家介紹了SpringBoot用配置影響B(tài)ean加載@ConditionalOnProperty示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評論