2014-07-04 35 views
6

我有一個Spring MVC + Mysql(JDBC 4)+ c3p0 0.9.2項目。c3p0 maxIdleTime與mysql的wait_timeout相同嗎?

在c3p0 maxIdleTime中,值爲240(即4分鐘)和wait_timeout,在Mysql的my.ini中爲30秒。

根據C3P0

maxIdleTime: (默認值:0) 秒一個連接可以保持彙集但被丟棄之前未使用的。零意味着空閒連接永不過期。

據到MySQL

WAIT_TIMEOUT:活動服務器等待關閉前一個 非交互連接上的秒數。

現在,我有這方面的一些douts:(一些答案是衆所周知的我,只是wated以確保我正確與否)

  1. 未使用的連接是指在sleep狀態的連接根據mysql(?)
  2. 什麼是交互式和非交互式連接?
  3. 未使用的連接和非交互連接是否相同?因爲我的DBA設置了wait_timeout到30秒(他通過觀察數據庫服務器來達到這個值,因此在睡眠模式下連接的數量非常少),這意味着連接可以在sleep模式中持續30秒,之後它將被關閉,但是在另一手c3p0的maxIdleTime設置爲240秒,所以這個maxIdleTime設置在這種情況下發揮作用。
  4. 什麼是interactive_timeout
+0

在休眠模式下的連接是最有可能的閒置的連接坐在你的游泳池裏。他們不應該太快關閉,因爲讓你的游泳池在下一次請求時重新創建它們是非常昂貴的。爲什麼你的DBA建議將wait_timeout設置爲30秒? – flup

+0

@flup,因爲在負載測試中,我觀察到'show full processlist'顯示'在DB = maxPoolSize'中的連接數量,並且我一直在獲取'連接無法從底層數據庫!獲得'異常。我發佈了這個問題請閱讀更多和一個http://stackoverflow.com/questions/24451317/why-sleep-mode-coonections-are-not-reused-by-c3p0 – Amogh

回答

21

首先讓我們來了解mysql的屬性。

  • interactive_timeout:在例如mysqldump或MySQL命令行工具秒mysql的shell會話 互動時間了。連接處於睡眠狀態。大多數情況下,這會設置爲更高的值,因爲您不希望它在MySQL cli上進行某些操作時斷開連接。
  • wait_timeout :MySQL處於非活動狀態的秒數將在 之前等待,它將在 秒內關閉非交互式連接上的連接。例如:從java連接。連接處於睡眠狀態。

現在讓我們來了解C3PO屬性和它與DB道具關係(我只是要去副本從你的問題)

  • maxIdleTime:(默認值:0)秒就有一個連接可以保持集中,但在被丟棄之前未被使用。零意味着空閒連接永不過期 。

這是指一個連接對象能維持多久是可用的,將在池中可用。超時結束後,c3po將銷燬或回收它。

現在問題來了,當你有maxIdleTime高於wait_timeout。 假設mxIdleTime : 50秒和wait_timeout : 40 s那麼你會得到Connection time out exception: Broken Pipe如果你試圖在過去10秒內做任何操作。所以maxIdelTime應該總是小於wait_timeout

而不是maxIdleTime你可以爲你以下屬性。

  • idleConnectionTestPeriod設置連接將在測試之前保持空閒狀態的時間限制。沒有preferredTestQuery,默認 是DatabaseMetaData.getTables()--這是數據庫不可知的,而 雖然相對昂貴的調用,但對於相對較小的數據庫可能是好的。如果您對性能偏執,則使用針對您的數據庫的 查詢(i.e. preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections會在活動激增之後將connectionCount返回 降至minPoolSize。

請注意,任何池屬性(如maxIdleTime)隻影響到連接這是在游泳池也就是說,如果休眠已經獲得了連接,並保持怠速運轉超過maxIdleTime,然後嘗試做任何操作那麼你將得到「破碎的管道」

在mysql上有較低的wait_timeout是很好的,但是當你已經構建了一個應用程序時,它並不總是正確的。 你必須確保在減少它之前,你的應用程序中你沒有保持連接打開更多的wait_time了。

您還必須考慮獲取連接是一項耗資巨大的任務,如果等待時間過低,則會影響連接池的整體目的,因爲它會經常嘗試獲取連接。

當您沒有手動進行連接管理時(例如使用Spring跨國API時),這一點尤其重要。當您輸入@Transaction帶註釋的方法時,Spring將開始事務處理,以便從池中獲取連接。如果您正在進行任何Web服務調用或讀取某些文件,而這會比wait_time花費更多時間,那麼您將得到異常。

我曾經遇到過這個問題。

在我的一個項目中,我有一個cron可以爲客戶做訂單處理。爲了加快速度,我使用了批處理。現在,我檢索了一批客戶並進行了一些處理(無數據庫調用)。當我嘗試保存所有我用來修理管道異常的訂單時。問題是我的等待時間是1分鐘,然後訂單處理花費更多時間。所以我們不得不增加到2分鐘。我可以減少批量,但是整體處理速度較慢。

+0

感謝您的詳細解釋,你清除了我的相關點以interactive_timeout,wait_timeout和maxIdleTime,但我沒有得到你最後的兩個點,但沒有後顧之憂,我終於明白了。 – Amogh

+0

將'wait_timeout'減少到30/15秒是否可以使連接不進入睡眠模式? – Amogh

+0

我已經更新了我的答案。簡而言之,如果您確定應用程序未連接超過30秒,則可以減少wait_time。 – bitkot

0
unused connection means the connection which are in sleep state according to mysql(?) 

根據MySQL的,這只是意味着連接建立與MySQL/DB,但一直在這裏沒有任何活動的時間過去量和由於到MySQL的配置/設置(可改),連接被破壞。

What is interactive and noninteractive connections? 

交互式連接是當您的輸入硬件(鍵盤)使用命令行與mysql進行交互時。簡而言之,您在這裏編寫查詢

非交互式或者說wait_timeout查詢是您的代碼與mysql建立連接的那些查詢。

Is unused connections and noninteractive coonections are same? because my DBA set wait_timeout to 30 seconds (he come to this value by observing DB server so that very less amount of connections be in sleep mode) this means an connection can be in sleep mode for 30 seconds after that it will be closed but at the otherhand c3p0's maxIdleTime is set to 240 seconds so whats this maxIdleTime setting playing role in this case. 

MaxIdleTime是由你的代碼在hibernateJpa配置,你問你的代碼本身關閉休眠連接(例如)後的連接是未使用的完成。您擁有此編碼器的所有權。

Wait_timeout另一方面來自mysql方面。因此,數據庫管理員需要設置並更改。

What is interactive_timeout? 

再一次,交互式超時是當你從命令行的鍵盤連接到mysql後編寫查詢時,以及在mysql啓動的時間。

如果你想知道更多關於如何改變這些值,通過這個鏈接: http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/

希望現在很明顯你:)

+0

謝謝你:))... – Amogh