簡體   English   中英

SQL連接使用DataSource超時

[英]SQL connections timing out with DataSource

我有一台服務器,該服務器向遠程主機提交查詢,以從數據庫訪問帳戶信息以登錄游戲服務器。 問題是連接隨機超時,但是,我正在使用DataSource,它應該自動重新建立任何丟失的連接。 有人知道如何解決該問題嗎?

public class Database {

private final PoolingDataSource source;

public Database(String driver, String url, String user, String password)
        throws ClassNotFoundException {
    Class.forName(driver);
    source = createSource(url, user, password);
}

@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
private PoolingDataSource createSource(String connectURI, String user,
        String password) {
    GenericObjectPool.Config config = new GenericObjectPool.Config();
    config.maxActive = 150;
    config.maxIdle = 100;
    config.minIdle = 30;
    config.maxWait = 1000;
    config.testWhileIdle = true;

    ObjectPool connectionPool = new GenericObjectPool(null, config);
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
            connectURI, user, password);
    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
            connectionFactory, connectionPool, null, null, false, true);
    PoolingDataSource poolingDataSource = new PoolingDataSource(
            connectionPool);
    return poolingDataSource;
}

public Connection getConnection() throws SQLException {
    return getSource().getConnection();
}

public PoolingDataSource getSource() {
    return source;
}
}

“回想起來……”,在2003年,我正在使用Tomcat 4.1,感到驚訝的是,它的DataSource實現要求您給它提供一個ValidationQuery,否則它將只初始化一次Connection,並且從不驗證數據庫服務器端仍然會尊重連接。 我們的Oracle服務器將簡單地消除60分鍾未使用的連接。 這樣做的結果是,當我的服務器容量變小時,我的一些池化連接將在數據庫服務器端被殺死,但是應用服務器不知道,直到它嘗試在更高的容量下使用它們。 在這一點上,他們只是堆棧跟蹤,這就是結束。 添加validationQuery具有DataSource本身的作用,可以保持連接有效,並且一切正常。 如果您有興趣,請參見https://groups.yahoo.com/neo/groups/seajug/conversations/messages/4902 ,了解此發現過程的詳細信息。

我建議您檢查您的GenericObjectPool實現是否具有驗證查詢或心跳等概念,並弄清楚如何利用它來保持“新鮮”連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM