在:
下执行的控制台应用程序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相关的错误,但我无法理解为什么。
答案 0 :(得分:0)
刚刚完成向BoneCP的迁移,解决了我的问题。我想由于多线程环境,dpcp没有提供来自池的连接,而是试图一次又一次地命中数据库。也许我已经解决了dpcp问题,但迁移到BoneCP也提供了性能优势。