1

控制檯應用程序下執行:當我剛結束執行這個應用(沒有測試數據庫限制),它工作正常錯誤:系統資源超出

1). Multiple threads 
2). Connection Pooling (as the database connections range could be 5 to 30) of type Microsoft Access using DBCP. 

。每當我嘗試在其中一臺機器上引入相同的應用程序時,它會產生一個錯誤。

我想知道爲什麼會發生這種情況,因爲這裏只有機器的區別。所以,它完美地工作在我的最後。

我不知道很多關於連接池,但它似乎不管我明白我已經實現:

public class TestDatabases implements Runnable{ 
    public static Map<String, Connection> correctDatabases; 

    @Override 
    public void run() { 
     // validating the databases using DBCP 
     datasource.getConnection(); // Obtaining the java.sql.Connection from DataSource 
     // if validated successfully °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸ putting them in correctDatabases 
    } 
} 

上述案例是使用ExecutorService =數據庫的數量來實現。

最後,我試圖將它們放入類型爲 Map<String, Connection>的靜態集合中,並在整個應用程序中使用它。換句話說:我試圖收集connectionString以及地圖中的連接。

在我的應用程序的其他部分,我只是處理與連接URL一起出現的多個線程。因此,要執行任何數據庫操作我打電話

Connection con = TestDatabases.correctDatases.get(connectUrl); 

那臺機器,這個應用程序工作正常周邊〜5個數據庫。當我試圖使用上面的Connection(con)激發查詢時,錯誤總是會生成,因爲stmt.executeQuery(query);

因爲我無法在我的結尾重現此問題,所以似乎有些事情正在進行連接池錯誤或者我沒有配置我的應用程序來正確處理連接池。

僅供參考,我在finally塊中正確執行Connection close塊,我的應用程序終止,此應用程序也使用Quartz Scheduler。連接池,從TestDatabases類中的下列呼籲設置爲完成:

public synchronized DataSource setUp() throws Exception { 
    Class.forName(RestConnectionValidator.prop.getProperty("driverClass")).newInstance(); 
    log.debug("Class Loaded."); 
    connectionPool = new GenericObjectPool(); 
    log.debug("Connection pool made."); 
    connectionPool.setMaxActive(100); 
    ConnectionFactory cf = new DriverManagerConnectionFactory(
      RestConnectionValidator.prop.getProperty("connectionUrl")+new String(get().toString().trim()), 
      "",""); 
    PoolableConnectionFactory pcf = 
     new PoolableConnectionFactory(cf, connectionPool, 
       null, null, false, true); 
    return new PoolingDataSource(connectionPool); 
} 

以下是我得到的錯誤(在其他機器)

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] System resource exceeded. 

以下是數據庫路徑:

jdbc:odbc:DRIVER= {Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\\DataSources\\PR01.mdb 

這些數據庫中的每一個似乎都不是很重(大約5到15 MB的總大小)。

於是,我留下了以下解決方案:

1). Correction of Connection Pooling or migrate to the newer one's like c3p0 or DBPool or BoneCP. 
2). Introducing batch concept - in which I will schedule my application for each group of 4 databases. It could be very expensive to deal with as any time the other schedule may also collapse. 

我敢肯定,這是與Java相關的錯誤,但我不能完全理解其中的原因。

+0

兩臺機器使用哪種版本的Access驅動程序?新機器可能需要驅動程序更新,例如儘管您認爲它們很小,但新機器上的JVM是否分配的內存更少? –

+0

感謝您的支持!看來新機器在更新驅動程序方面有一些限制,而且大多數微軟更新都是不可行的。我現在能夠以某種方式在我的最後重現這些問題。這似乎是連接管理問題?因爲我已經在使用ConnectionPooling - dbcp。 – Sanchit

回答

0

剛剛完成遷移到BoneCP解決了我的問題。我猜想由於多線程環境,dpcp並沒有提供池中的連接,而是試圖一次又一次地訪問數據庫。也許我可以解決dpcp問題,但遷移到BoneCP也提供了性能優勢。

相關問題