C3PO數(shù)據(jù)庫連接池
優(yōu)點:性能比較dbcp好,穩(wěn)定性也比dbcp強
參數(shù)介紹
? BasicDataSource 相關(guān)的參數(shù)說明
dataSource: 要連接的 datasource (通常我們不會定義在 server.xml)
defaultAutoCommit: 對于事務(wù)是否 autoCommit, 默認值為 true
defaultReadOnly: 對于數(shù)據(jù)庫是否只能讀取, 默認值為 false
driverClassName:連接數(shù)據(jù)庫所用的 JDBC Driver Class,
maxActive: 可以從對象池中取出的對象最大個數(shù),為0則表示沒有限制,默認為8
maxIdle: 最大等待連接中的數(shù)量,設(shè) 0 為沒有限制 (對象池中對象最大個數(shù))
minIdle:對象池中對象最小個數(shù)
maxWait: 最大等待秒數(shù), 單位為 ms, 超過時間會丟出錯誤信息
password: 登陸數(shù)據(jù)庫所用的密碼
url: 連接數(shù)據(jù)庫的 URL
username: 登陸數(shù)據(jù)庫所用的帳號
validationQuery: 驗證連接是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned: 是否自我中斷, 默認是 false
removeAbandonedTimeout: 幾秒后會自我中斷, removeAbandoned 必須為 true
logAbandoned: 是否記錄中斷事件, 默認為 false
minEvictableIdleTimeMillis:大于0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證;默認30分鐘
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小于等于0,不會啟動檢查線程,默認-1
testOnBorrow:取得對象時是否進行驗證,檢查對象是否有效,默認為false
testOnReturn:返回對象時是否進行驗證,檢查對象是否有效,默認為false
testWhileIdle:空閑時是否進行驗證,檢查對象是否有效,默認為false
? 在使用DBCP的時候,如果使用默認值,則數(shù)據(jù)庫連接因為某種原因斷掉后,再從連接池中取得連接又不進行驗證,這時取得的連接實際上就會是無效的數(shù)據(jù)庫連接。因此為了防止獲得的數(shù)據(jù)庫連接失效,在使用的時候最好保證:
username: 登陸數(shù)據(jù)庫所用的帳號
validationQuery:SELECT COUNT(*) FROM DUAL
testOnBorrow、testOnReturn、testWhileIdle:最好都設(shè)為true
minEvictableIdleTimeMillis:大于0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小于等于0,不會啟動檢查線程
? PS:在構(gòu)造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也會使用GenericObjectPool] 時,會生成一個內(nèi)嵌類Evictor,實現(xiàn)自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每過 timeBetweenEvictionRunsMillis毫秒Evictor會調(diào)用evict()方法,檢查對象的閑置時間是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0時則忽略,默認為30分 鐘),是則銷毀此對象,否則就激活并校驗對象,然后調(diào)用ensureMinIdle方法檢查確保池中對象個數(shù)不小于_minIdle。在調(diào)用 returnObject方法把對象放回對象池,首先檢查該對象是否有效,然后調(diào)用PoolableObjectFactory 的passivateObject方法使對象處于非活動狀態(tài)。再檢查對象池中對象個數(shù)是否小于maxIdle,是則可以把此對象放回對象池,否則銷毀此對 象
TransactionManager
一個使用 MyBatis-spring的主要原因是它允許 MyBatis 參與到 Spring 的事務(wù)管理中。而 不是給 MyBatis 創(chuàng)建一個新的特定的事務(wù)管理器,MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager。
一旦 Spring 的 PlatformTransactionManager 配置好了,你可以在 Spring 中以你通常的做 法來配置事務(wù)。@Transactional 注解和 AOP(Aspect-Oriented Program,面向切面編程,譯 者注)樣式的配置都是支持的。在事務(wù)處理期間,一個單獨的 SqlSession 對象將會被創(chuàng)建 和使用。當(dāng)事務(wù)完成時,這個 session 會以合適的方式提交或回滾。
一旦事務(wù)創(chuàng)建之后,MyBatis-Spring 將會透明的管理事務(wù)。在你的 DAO 類中就不需要額 外的代碼了。
要 開 啟 Spring 的 事 務(wù) 處 理 , 在 Spring 的 XML 配 置 文 件 中 簡 單 創(chuàng) 建 一 個 DataSourceTransactionManager 對象:
指定的 DataSource 一般可以是你使用 Spring 的任意 JDBC DataSource。這包含了連接 池和通過 JNDI 查找獲得的 DataSource。
要注意, 為事務(wù)管理器指定的 DataSource 必須和用來創(chuàng)建 SqlSessionFactoryBean 的 是同一個數(shù)據(jù)源,否則事務(wù)管理器就無法工作了。
如果你正使用一個 JEE 容器而且想讓 Spring 參與到容器管理事務(wù)(Containermanaged transactions,CMT,譯者注)中,那么 Spring 應(yīng)該使用 JtaTransactionManager 或它的容 器指定的子類來配置。做這件事情的最方便的方式是用 Spring 的事務(wù)命名空間:
在這種配置中,MyBatis 將會和其它由 CMT 配置的 Spring 事務(wù)資源一樣。Spring 會自動 使用任意存在的容器事務(wù),在上面附加一個 SqlSession。如果沒有開始事務(wù),或者需要基 于事務(wù)配置,Spring 會開啟一個新的容器管理事務(wù)。
注 意 , 如 果 你 想 使 用 CMT , 而 不 想 使 用 Spring 的 事 務(wù) 管 理 , 你 就 必 須 配 置 SqlSessionFactoryBean 來使用基本的 MyBatis 的 ManagedTransactionFactory 而不是其 它任意的 Spring 事務(wù)管理器:
MyBatis 的 SqlSession 提供指定的方法來處理編程式的事務(wù)。 但是當(dāng)使用 MyBatis-Spring 時, bean 將會使用 Spring 管理的 SqlSession 或映射器來注入。 那就是說 Spring 通常是處理 事務(wù)的。
你 不 能 在 Spring 管 理 的 SqlSession 上 調(diào) 用 SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 這 樣 做 了 , 就 會 拋 出 UnsupportedOperationException 異常。注意在使用注入的映射器時不能訪問那些方法。
無論 JDBC 連接是否設(shè)置為自動提交, SqlSession 數(shù)據(jù)方法的執(zhí)行或在 Spring 事務(wù)之外 任意調(diào)用映射器方法都將會自動被提交。