MyBatis主要利用數據源(Date Source)來管理數據庫鏈接,分爲:UNPOOLED、POOLED和JNDI,如今主要看下POOLED也就是鏈接池方式,它的配置以下:java
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <package name="core.mappers"/> </mappers> </configuration>
這裏注意,MyBatis底層也是使用MySQL提供的JDBC driver,因此要記得在工程裏包含這個庫。它還能夠配置如下一些屬性:mysql
poolMaximumActiveConnections – 在任意時間能夠存在的活動(也就是正在使用)鏈接數量,默認值:10 poolMaximumIdleConnections – 任意時間可能存在的空閒鏈接數。 poolMaximumCheckoutTime – 在被強制Roll Back(認爲是Overdue)以前,池中鏈接能夠被檢出(checked out使用)的時間,默認值:20000 毫秒(即 20 秒) poolTimeToWait – 這是一個底層設置,若是獲取鏈接花費了至關長的時間,鏈接池會打印狀態日誌並從新嘗試獲取一個鏈接(避免在誤配置的狀況下一直安靜的失敗),默認值:20000 毫秒(即 20 秒)。 poolMaximumLocalBadConnectionTolerance – 這是一個關於壞鏈接容忍度的底層設置, 做用於每個嘗試從緩存池獲取鏈接的線程。 若是這個線程獲取到的是一個壞的鏈接,那麼這個數據源容許這個線程嘗試從新獲取一個新的鏈接,可是這個從新嘗試的次數不該該超過 poolMaximumIdleConnections 與 poolMaximumLocalBadConnectionTolerance 之和。 默認值:3 (新增於 3.4.5) poolPingQuery – 發送到數據庫的偵測查詢,用來檢驗鏈接是否正常工做並準備接受請求。默認是「NO PING QUERY SET」,這會致使多數數據庫驅動失敗時帶有一個恰當的錯誤消息。 poolPingEnabled – 是否啓用偵測查詢。若開啓,須要設置 poolPingQuery 屬性爲一個可執行的 SQL 語句(最好是一個速度很是快的 SQL 語句),默認值:false。 poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率。能夠被設置爲和數據庫鏈接超時時間同樣,來避免沒必要要的偵測,默認值:0(即全部鏈接每一時刻都被偵測 — 固然僅當 poolPingEnabled 爲 true 時適用)。
在利用SqlSessionFactoryBuilder建立DefaultSqlSessionFactory時,經過XMLConfigBuilder來讀取上面config文件裏的內容,看到dataSource的類型爲POOLED,則利用反射建立PooledDataSourceFactory:sql
private DataSourceFactory dataSourceElement(XNode context) throws Exception { if (context != null) { String type = context.getStringAttribute("type"); Properties props = context.getChildrenAsProperties(); DataSourceFactory factory = (DataSourceFactory)this.resolveClass(type).newInstance(); factory.setProperties(props); return factory; } else { throw new BuilderException("Environment declaration requires a DataSourceFactory."); } }
再利用工廠模式(SOLID設計原則與工廠模式)建立PooledDataSource,放入利用Builder模式建立的Environment中,最後存入Configuration數據庫
private void environmentsElement(XNode context) throws Exception { if (context != null) { if (this.environment == null) { this.environment = context.getStringAttribute("default"); } Iterator var2 = context.getChildren().iterator(); while(var2.hasNext()) { XNode child = (XNode)var2.next(); String id = child.getStringAttribute("id"); if (this.isSpecifiedEnvironment(id)) { TransactionFactory txFactory = this.transactionManagerElement(child.evalNode("transactionManager")); DataSourceFactory dsFactory = this.dataSourceElement(child.evalNode("dataSource")); DataSource dataSource = dsFactory.getDataSource(); Builder environmentBuilder = (new Builder(id)).transactionFactory(txFactory).dataSource(dataSource); this.configuration.setEnvironment(environmentBuilder.build()); } } } }
UML類圖以下:segmentfault
未完待續:
MyBatis鏈接管理(2)緩存