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也提供了性能优势。