1

Консольное приложение выполняет при:Ошибка: 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 ошибка, но я не могу понять, почему.

+0

Какую версию драйверов доступа используют обе машины? Новая машина может нуждаться в обновлениях драйверов, таких как Пока вы говорите, что они маленькие, имеет ли JVM на новом меньше памяти? –

+0

Спасибо за это! Кажется, у новой машины есть некоторые ограничения по обновлению драйверов, а также большинство обновлений Microsoft не выполнимы. Теперь я могу как-то воспроизвести проблемы в конце. Кажется ли это проблемой управления связью? Поскольку я уже использую ConnectionPooling - dbcp. – Sanchit

ответ

0

Только что перешел на BoneCP, который решил мою проблему. Я думаю, из-за многопоточной среды dpcp не предоставлял соединение из пула, а пытался снова и снова ударить по базе данных. Возможно, я мог решить проблему dpcp, но переход на BoneCP также обеспечивает преимущество производительности.