C3P0數(shù)據(jù)庫連接池和TransactionManager

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

事務(wù)

一個使用 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 類中就不需要額 外的代碼了。

標(biāo)準配置

要 開 啟 Spring 的 事 務(wù) 處 理 , 在 Spring 的 XML 配 置 文 件 中 簡 單 創(chuàng) 建 一 個 DataSourceTransactionManager 對象:

指定的 DataSource 一般可以是你使用 Spring 的任意 JDBC DataSource。這包含了連接 池和通過 JNDI 查找獲得的 DataSource。

要注意, 為事務(wù)管理器指定的 DataSource 必須和用來創(chuàng)建 SqlSessionFactoryBean 的 是同一個數(shù)據(jù)源,否則事務(wù)管理器就無法工作了。

容器管理事務(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ù)管理器:

編程式事務(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)用映射器方法都將會自動被提交。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,248評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • application的配置屬性。 這些屬性是否生效取決于對應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,540評論 1 27
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 這些屬性是否生效取決于對應(yīng)的組件是否聲明為 Spring 應(yīng)用程序上下文里的 Bean(基本是自動配置的),為一個...
    發(fā)光的魚閱讀 1,489評論 0 14

友情鏈接更多精彩內(nèi)容