错误:超出系统资源

时间:2014-02-10 12:53:54

标签: java multithreading ms-access connection-pooling apache-commons-dbcp

在:

下执行的控制台应用程序
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 =数据库数量实现的。

最后,我试图把它们放在一个静态的Type of Type中 Map<String, Connection>并在整个申请过程中使用它。换句话说:我正在尝试收集connectionString以及地图中的连接。

在我的应用程序的其他部分,我只是处理连接URL附带的多个线程。因此,要执行任何数据库操作,我正在调用

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

对于该机器,此应用程序适用于约5个数据库。当我尝试使用上面的连接(con)作为stmt.executeQuery(query);

尝试触发查询时,总是会生成错误

因为,我无法在我的问题上重现这个问题,似乎连接池出现了问题,或者我没有将我的应用程序配置为正确处理连接池。

仅为了您的信息,我正在我的应用程序终止的Connection close块中正确执行finally,此应用程序也在使用Quartz Scheduler。对于连接池,对于setUp,将对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相关的错误,但我无法理解为什么。

1 个答案:

答案 0 :(得分:0)

刚刚完成向BoneCP的迁移,解决了我的问题。我想由于多线程环境,dpcp没有提供来自池的连接,而是试图一次又一次地命中数据库。也许我已经解决了dpcp问题,但迁移到BoneCP也提供了性能优势。