Консольное приложение выполняет при:Ошибка: System Resource Превышен
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);
Как, я не могу воспроизвести эту проблему в конце, кажется, что-то происходит неправильно с пулом соединений или я не настроил приложение для правильной работы с пулом соединений.
Просто для вашей информации, я правильно выполняю Connection close
в finally
блоке, где мое приложение завершается, и это приложение также использует 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 МБ общего объема).
Итак, я остался со следующими растворами:
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 ошибка, но я не могу понять, почему.
Какую версию драйверов доступа используют обе машины? Новая машина может нуждаться в обновлениях драйверов, таких как Пока вы говорите, что они маленькие, имеет ли JVM на новом меньше памяти? –
Спасибо за это! Кажется, у новой машины есть некоторые ограничения по обновлению драйверов, а также большинство обновлений Microsoft не выполнимы. Теперь я могу как-то воспроизвести проблемы в конце. Кажется ли это проблемой управления связью? Поскольку я уже использую ConnectionPooling - dbcp. – Sanchit