2013-03-28 26 views
1

在我們的項目中,我們正在維護自己的數據庫連接池。
爲解決問題'java.sql.SQLRecoverableException: Io exception大多數人建議使用標準連接池,如apache dbcp。連接重置期間DBConnectionPool的行爲如何

  • 我想知道在連接重置期間,那些標準池機制會執行什麼邏輯?
  • DBConnectionPool如何知道數據庫連接已超時?因爲我們知道conn.isClosed()在這裏沒有幫助。
  • 它是每個數據庫連接將有一個與DB服務器的TCP客戶端套接字?
  • 最後是可取的;每當我將連接返回到池中時;游泳池應該關閉連接;如果連接存在超過〜10分鐘,則返回? [〜10分鐘服務器端連接超時變量]

請回答我所有的問題。

回答

2

我回答了這個問題,假設您通過使用org.apache.commons.pool.impl.GenericObjectPool,org.apache.commons.dbcp.DataSourceConnectionFactory,org.apache.commons.dbcp.PoolableConnectionFactoryorg.apache.commons.dbcp.PoolingDataSource類使用Apache DBCP進行連接池。

  • 我在想什麼是標準池機制01​​將在連接重置期間執行的邏輯是什麼? 如果GenericObjectPool.testOnBorrowGenericObjectPool.testOnReturn設置爲true。將使用設置在PoolableConnectionFactory中的validationQuery來驗證連接是否處於活動狀態。如果驗證失敗,則刪除Connection對象,並創建新對象並添加到池中
  • DBConnectionPool如何知道數據庫連接已超時?因爲 我們知道conn.isClosed()在這裏沒有幫助。 與上面相同的機制
  • 是否每個數據庫連接都會有一個帶有數據庫 服務器的tcp客戶端套接字?
  • 最後是可取的;每當我返回連接到 池;游泳池應該關閉連接;如果連接已經存在 超過〜10分鐘就會被創建? [〜10分鐘服務器端連接 超時變量] 如果您認爲它不應該創建不必要的網絡流量,並且您有特殊的理由要這樣做。你能行的。通過與timeBetweenEvictionRunsMillis一起設置在GenericObjectPoolminEvictableIdleTimeMillis,如果你想根據空閒時間刪除
+0

你的意思是說,每當一個新的連接請求;該池將在DB上執行測試查詢(validationQuery)執行以驗證TCP狀態。如果查詢成功,則池將返回該連接? –

+0

如果您正在使用數據庫池,則您無法控制新的連接。它決定何時創建新的連接。但是,作爲對第一個問題的回答,解釋testOnBorrow和testOnReturn可用於在將現有連接提供給用戶之前驗證現有連接的狀態。 – shazin

+0

我的問題是,這是如何驗證:(????????????????? –