2015-12-22 91 views
2

我使用樹脂服務器+彈簧框架和C3P0連接池。我已經使用以下屬性文件配置了連接池。但不知何故每24小時左右我的網站面臨連接超時錯誤,然後我必須重新啓動我的樹脂服務器,使網站再次生活。請告訴我什麼是錯誤的以下配置文件和什麼即時消息在這裏丟失。C3P0連接池給出連接超時錯誤具有這種配置

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
jdbc.username=my_username 
jdbc.password=my_password 
jdbc.acquireIncrement=10 
jdbc.minPoolSize=20 
jdbc.maxPoolSize=30 
jdbc.maxStockPoolSize=30 
jdbc.maxStatements=100 
jdbc.numOfHelperThreads=6 
jdbc.testConnectionOnCheckout=true 
jdbc.testConnectionOnCheckin=true 
jdbc.idleConnectionTestPeriod=30 
jdbc.prefferedTestQuery=select curdate(); 
jdbc.maxIdleTime=7200 
jdbc.maxIdleTimeExcessConnections=5 
+0

連接超時的一個原因可能是所有連接都耗盡。如果我說你的應用程序中可能存在連接泄漏,你會同意嗎?如果是,請嘗試識別並修復它們。使用c3p0池可以輕鬆識別泄漏。 – Yasin

+0

是的。有連接泄漏,但我不知道如何導致超時錯誤。 – user2522497

+0

我有一個類似的問題,但與不同的數據庫服務器。 'http:// stackoverflow.com/questions/26864383/mysql-hibernate-connection-issue-while-using-c3p0'。嘗試啓用c3p0的日誌並檢查發生了什麼。 –

回答

3

於是,一堆東西。

  • c3p0內置了用於觀察和調試連接泄漏的工具。請設置配置參數 unusedConnectionTimeout unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces。設置一個unreturnedConnectionTimeout,它定義了一段時間後,c3p0應該假定Connection已經泄漏,然後關閉它。設置debugUnreturnedConnectionStackTraces以要求c3p0記錄檢出沒有正確檢入的連接的堆棧跟蹤。請參閱Configuring to Debug and Workaround Broken Client Applications
  • 您正在以非標準方式配置c3p0。這可能是好的,或者沒有,但你想驗證你打算設置的配置是配置c3p0獲得。 c3p0 DataSources在INFO池初始化時轉儲它們的配置。 請考慮檢查以確保您獲得您想要的配置。或者,您可以通過JMX檢查您的DataSource的運行時配置。
  • 除了配置的非標準手段,幾個配置屬性似乎不妥。 prefferedTestQuery應該是preferredTestQuerynumOfHelperThreads應該是numHelperThreads
  • 以下是不C3P0配置名稱都沒有。也許你在內部將它們映射到c3p0配置,但是你想驗證這一點。這裏是not-c3p0屬性名稱:

    jdbc.driverClassName=com.mysql.jdbc.Driver 
    jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
    jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    jdbc.username=my_username 
    jdbc.maxStockPoolSize=30 
    

    在一個標準的c3p0中。屬性形式,你可能的意思是

    c3p0.driverClass=com.mysql.jdbc.Driver 
    c3p0.jdbcURL=jdbc:mysql://localhost/my_database1_url 
    # no equivalent -- jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    c3p0.user=my_username 
    # no equivalent -- jdbc.maxStockPoolSize=30 
    

    請參閱Configuration Properties。同樣,c3p0對jdbc.-前綴屬性一無所知,但也許在你自己的庫或中間件中找到了一些東西。

注:我喜歡看到@檢查連接泄漏的NiSay的方式,因爲我喜歡看到人們使用更先進的C3P0 API。只要你不熱更新你的DataSource的配置,它就會工作。但是你不需要付出那麼多麻煩,並且不能保證這種方法在將來的版本中將繼續有效。c3p0對ConnectionCustomizer生命週期沒有任何承諾。 ConnectionCustomizers旨在是無狀態的。使用c3p0的內置泄漏檢查設施更簡單,更安全,如上面第一個要點所述。

+0

是的Steve im在內部將它們映射到web.xml文件中的正確值。在jdbc屬性文件中指定的名稱只是在web.xml文件中調用的變量。我已經明白了。 preferredTestQuery和numHelperThreads在web.xml文件中是正確的。 – user2522497

+0

謝謝史蒂夫。按照您的建議添加了unusedConnectionTimeout和debugUnreturnedConnectionStackTraces。而現在我的網站自4天以來一直沒有下降。但我不知道這將持續多久,我的網站沒有下降。請告訴我,如果只有連接泄漏給我造成這個問題?以及如何解決連接泄漏問題。 – user2522497

+0

@Steve Waldman +1第一點。 – Yasin

1

由於有可能在程序連接泄漏(連接超時的可能原因)的可能性,你需要遵循,以確定泄漏下面的步驟。

請在您的c3p0.properties項文件

c3p0.connectionCustomizerClassName = some.package.ConnectionLeakDetector 

名爲「ConnectionLeakDetector」創建一個類,並將其放置在相應的包。以下是課程的內容。

import java.sql.Connection; 
import java.util.concurrent.atomic.AtomicInteger; 

public class ConnectionLeakDetector implements com.mchange.v2.c3p0.ConnectionCustomizer { 

    static AtomicInteger connectionCount = new AtomicInteger(0); 
    @Override 
    public void onAcquire(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 

    } 

    @Override 
    public void onDestroy(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
    } 

    @Override 
    public void onCheckOut(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections acquired: " + connectionCount.decrementAndGet()); 
    } 

    @Override 
    public void onCheckIn(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections released: " + connectionCount.incrementAndGet()); 
    } 

} 

的onCheckOut方法將遞增計數時,所獲取的連接,其中,如將onCheckOut遞減它的連接被釋放時。

執行某些情況下,觀察你的控制檯上的統計信息。如果計數大於0,則執行的方案有連接泄漏。嘗試解決它們,你會觀察到不同之處。

作爲一個側面說明,您可以遞增jdbc.maxPoolSize作爲一個臨時解決方案,直到您部署的修補程序。

+0

好的,我會嘗試這個解決方案並很快發佈我的回覆。謝謝 – user2522497