(讀書筆記)mybatis (三)-----environments詳解
Mybatis可以配置成適應多種環境,這種機制有助於將SQL對映應用於多種資料庫之中,顯示情況下有多重理由需要這麼做。例如:開發,測試和生產環境需要不同的配置;或者共享相同的Schema的多個上產資料庫,想使用相同的sql對映。注意:可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一
如果想連線兩個資料庫,就需要建立兩個SQlSessionFactory例項,每個資料庫對應一個。而如果是三個資料庫,就需要三個例項,以此類推。
每個資料庫對應一個SqlSessionFactory例項
為了指定建立那種環境,只要將它作為可選的引數傳遞給SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是:
SqlSessionFactory factory = new SqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder.build(reader, environment,properties);
如果忽略了環境引數,那麼預設環境將會被載入,如下所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder.build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder.build(reader,properties);
環境元素配置環境:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置資料庫連線資訊 --> <dataSource type="POOLED"> <!-- value屬性值引用db.properties配置檔案中配置的值 --> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${name}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments>
- 預設的環境ID(比如:default:"development")development : 開發模式 work : 工作模式
- 每個 environment 元素定義的環境 ID(比如:id=”development”)。
- 事務管理器的配置(比如:type=”JDBC”)
- 資料來源的配置(比如:type=”POOLED”)。
預設的環境和環境 ID 是一目瞭然的。隨你怎麼命名,只要保證預設環境要匹配其中一個環境ID。
事務管理器(transactionManager)
事務管理器有兩種:type="[ JDBC | MANAGED ]":
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務範圍。
MANAGED :這個配置從來都不提交和回滾一個連線,而是讓容器來管理事務的整個生命週期(比如JEE應用服務的上下文)。預設情況下他會關閉連線,然而一些容器並不希望這樣,因此需要將closeConnection屬性設定為false來阻止它預設的關閉行為。
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模組會使用自帶的管理器來覆蓋前面的配置。
dataSource--資料來源
dataSource元素使用標準的JDBC資料來源介面來配置JDBC連線物件的資源。
三種內建的資料來源型別:type=[ UNPOOLED | POOLED | JNDI ]
UNPOOLED - 這個資料來源的實現只是每次請求時開啟和關閉連線。雖然一點慢,他對在及時可用連線方面沒有效能要求的簡單應用程式是一個很好的選擇,不同的資料庫在這方面表現也是不一樣的,所以對某些資料庫來說使用連線池並不重要,這個配置也是理想的。UNPOOLED型別的資料來源僅僅需要配置一下5種屬性:
- driver:JDBC驅動的java類的完全限定名
- url:資料庫的JDBC URL地址
- userName: 登入資料庫的使用者名稱
- password : 登入資料庫的密碼
- dedaultTransactionIsolationLevel– 預設的連線事務隔離級別。
作為可選項,你也可以傳遞屬性給資料庫驅動,要這樣做,屬性的字首為“driver.”,例如:driver.encoding=UTF8
這將通過DriverManager.getConnection(url,driverProperties) 方法傳遞值為UTF8的encoding 屬性給資料庫驅動。
POOLED - 這種資料來源的實現利用“池”的概念將JDBC連線物件組織起來,避免了建立先的連線例項時所必須的初始化和認證時間。這是一種使得併發WEb應用快速響應請求的流行的處理方式。
除了上述提到UNPOOLED下的屬性外,還有以下屬性來配置POOLED的資料來源:
- poolMaximumActiveConnections-在任意時間可以存在的活動(也就是正在使用)連線數量,預設值:10
- poolMaximumIdleConnections - 任意時間可能存在的空閒連線數。
- poolMaximumCheckoutTime - 再被強制返回之前,池中連線被檢出時間,預設值2W毫秒 即20s
- poolTimeToWait - 這是一個底層設定,如果獲取連線花費的相當長的時間,它會給連線池列印狀態日誌並重新嘗試獲取一個連線(避免在誤配置的情況下一直安靜的失敗),預設值:2W毫秒即 20 s
- PoolPingQuery - 傳送到資料庫的偵測查詢,用來檢驗連線是否處在正常工作秩序中並準備接受請求。預設是“NO PING QUERY SET”,這會導致多數資料庫驅動失敗時帶有一個恰當的錯誤訊息
- PoolPingConnectionsNotUsedFor -配置 poolPingQuery 的使用頻度。這可以被設定成匹配具體的資料庫連線超時時間,來避免不必要的偵測,預設值:0(即所有連線每一時刻都被偵測 — 當然僅當 poolPingEnabled 為 true 時適用)。
JDNI- 這個資料來源的實現是為了能在如EJB或應用伺服器這類容器中使用,容器可以集中在外部配置資料來源,然後放置一個JDNI上下文的引用。這種資料來源只需要兩個屬性:
- initial_context - 這個屬性用來InitailContext中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那麼 data_source 屬性將會直接從 InitialContext 中尋找
- data_source - 這是引用資料來源例項位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查詢,沒有提供時則直接在 InitialContext 中查詢
和其他資料來源配置類似,可以通過新增字首“env.”直接把屬性傳遞給初始上下文。比如:
env.encoding=UTF8
這就是在初始上下文(InitialContext)例項化時往它的構造方法傳遞值為UTF8 的 encoding 屬性。