2014-02-07 163 views
2

我有一臺服務器向遠程主機提交查詢,以便從數據庫訪問帳戶信息以登錄到遊戲服務器。問題是連接超時,但我正在使用DataSource應該自動重建任何丟失的連接。任何人都有線索如何解決這個問題?SQL連接與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; 
} 
} 
+1

某些池數據源使用收割線程來回收看似未使用的連接。你是否堅持這些連接,並且他們是否有長時間運行的查詢? –

+0

不,我不是,但是我應該糾正我原來的帖子。提交查詢時連接只會超時。 – Hoodlom

回答

1

「早在一天...」,在2003年,我在Tomcat 4.1工作並感到不高興地發現,要求其實施的DataSource,你給它一個validationQuery否則它會初始化只連接一次,永遠不要驗證數據庫服務器端是否仍然會遵守連接。我們的Oracle服務器將簡單地消除60分鐘內尚未使用的連接。這樣做的結果是,由於我的服務器數量很少,我的一些連接池會在數據庫服務器端被殺死,但是應用服務器在嘗試使用它們的時候並不知道。在這一點上,他們只是進行了堆棧跟蹤,這是它的結束。添加驗證查詢具有DataSource本身保持連接活動並且一切正常工作的效果。如果你有興趣,這個發現過程的細節在這裏https://groups.yahoo.com/neo/groups/seajug/conversations/messages/4902

我建議您檢查一下您的GenericObjectPool實現是否具有驗證查詢或心跳等概念,並找出如何利用它來保持您的連接「新鮮」。

+0

http://stackoverflow.com/questions/11125962/correct-way-to-keep-pooled-connections-alive-or-time-them-out-and-get-fresh-one –