在mybatis-config.xml中有初始的配置:
<!-- 對事務的管理和連接池的配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
從這可以看出,environments主要用於配置數據庫相關,而且可以在里面配置多個environment。
因為有這些場景:
1)為了開發設置不同的數據庫配置
2)測試和生產環境數據庫不同
3)有多個數據庫卻共享相同的模式,即對不同的數據庫使用相同的SQL映射
我們可以配置幾個數據庫配置,我們可以這樣:
<!-- 對事務的管理和連接池的配置 --> <environments default="oracle_jdbc"> <environment id="oracle_jdbc"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.oracle.driverClassName}" /> <property name="url" value="${jdbc.oracle.url}" /> <property name="username" value="${jdbc.oracle.username}" /> <property name="password" value="${jdbc.oracle.password}" /> </dataSource> </environment> <environment id="mysql_jdbc"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.mysql.driverClassName}" /> <property name="url" value="${jdbc.mysql.url}" /> <property name="username" value="${jdbc.mysql.username}" /> <property name="password" value="${jdbc.mysql.password}" /> </dataSource> </environment> </environments>
用default指定默認的數據庫鏈接:(這里默認oracle)
<environments default="oracle_jdbc">
我們每個數據庫,對應一個SqlSessionFactory,可以明確的獲取哪一個數據庫的SqlSessionFactory。
根據數據庫環境,獲取SqlSessionFactory:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
我們的每個數據庫信息都定義在environment中,我們看下這下面的配置:
1.transactionManager
示例配置:
<transactionManager type="JDBC" />
type取值范圍:
JDBC:簡單的使用JDBC的提交和回滾設置,一覽與從數據員得到的鏈接來管理事務范圍
MANAGED:這個配置幾乎什么都沒做,它從來不提交或回滾一個鏈接,而它讓容器來管理事務的整個生命周期(比如spring、jee應用服務器的上下文)
在默認情況下,MANAGED會關閉連接,如果有時候不希望這樣時,可以從連接中停止它,將claseConnection屬性設置為false:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
2.dataSource
用來配置基本的JDBC數據源連接信息
示例配置:
<dataSource type="POOLED"> <property name="driver" value="${jdbc.mysql.driverClassName}" /> <property name="url" value="${jdbc.mysql.url}" /> <property name="username" value="${jdbc.mysql.username}" /> <property name="password" value="${jdbc.mysql.password}" /> </dataSource>
type取值范圍:
UNPOOLED:這個數據源的實現是每次被請求時打開和關閉連接。速度會有一些慢,適用於簡單的應用程序。
這種類型的數據源只需要配置下面的6種屬性(最后一項為可選):
| driver | JDBC驅動名 |
| url | JDBC URL地址 |
| username | 數據庫用戶名 |
| password | 數據庫密碼 |
| defaultTransactionIsolationLevel | 默認的鏈接事務隔離級別 |
| driver.encoding | utf-8(可選項) |
POOLED:這是JDBC鏈接對象的數據源連接池的實現,用來避免創建新的鏈接實例時必要的連接和認證時間。適用於當前Web應用程序用來快速響應請求
這種類型的數據源除了需要配置UNPOOLED中的基礎配置外,還可以配置下面的內容:
| poolMaximumActiveConnections | 在任意時間正在使用鏈接的數量 |
| poolMaximumIdleConnections | 任意時間存在的空閑連接數,經驗值建議設置在與poolMaximumActiveConnections相同即可 |
| poolMaximumCheckoutTime | 獲取鏈接時如果沒有idleConnection同時activeConnection達到最大值,則從activeConnections列表第一個鏈接開始,檢查是否超過該設置的時間,如果超過,則被強制失效,返回鏈接。默認值為20000毫秒,建議設置在預期最大的SQL執行時間。 |
| poolTimeToWait | 給連接池一個打印日志狀態機會的低層次設置,還有重新嘗試獲取連接,這些情況往往會需要很長時間。為了避免連接池沒有配置時靜默失敗。默認值20000毫秒,建議默認設置。 |
| poolPingQuery | 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且准備接受請求。默認為“NO PING QUERY SET”,這會引起許多數據庫驅動連接由一個錯誤信息而導致失敗,建議使用select 1,開銷小 |
| poolPingEnabled | 這是開啟或禁用偵測查詢,如果開啟,必須用一個合法的SQL語句,設置poolPingQuery屬性,默認值為false,建議啟用,防止服務器端異常關閉,導致客戶端錯誤。 |
| poolPingConnectionsNotUsedFor | 用來配置poolPingQuery多長時間被調用一次。可以被設置匹配標准的數據庫鏈接超時時間,來避免不必要的偵測。默認值0(也就是所有鏈接每一時刻都被偵測到,但僅僅當poolPingEnabled為true時適用)。建議小於服務器端超時時間,MySQL默認超時是8小時。 |
JNDI:這個數據源是為了使用如Spring或應用服務器這類的容器,容器可以集中或在外部配置數據源,然后設置JNDI上下文的引用。
這個數據源只需要配置兩個屬性:
| initial_context | 用來從初始上下文中尋找環境(也就是initialContext.lookup(initial——context)),這是個可選屬性,如果被忽略,那么data_source屬性將直接以initialContext為背景再次尋找 |
| data_source | 這是引用數據源實例位置的上下文的路徑,它會以initial_context查詢返回的環境為背景來查找,如果initial_context沒有返回結果時,直接以初始上下文為環境來查找。 |
和其他數據源配置類似,他可以通過名“env.”的前綴來直接向初始上下文發送屬性,比如:
env.encoding=UTF8
原文轉自《mybatis學習總結-核心配置文件mybatis-config.xml(二)》,稍有修改和注解。
