Превышены системные ресурсы OleDbException - PullRequest
7 голосов
/ 01 октября 2008

Следующий код выполняет простую команду вставки. Если он вызывается 2000 раз подряд (для вставки 2000 строк), генерируется OleDbException с message = "System Resources Exceeded". Что-то еще, что я должен сделать, чтобы освободить ресурсы?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}

Ответы [ 5 ]

5 голосов
/ 01 октября 2008

Ошибка системных ресурсов: не из-за управляемого кода, а из-за того, что вы убили свою базу данных (JET?)

Вы открываете путь ко многим связям, путь к быстрому ...

Несколько советов:

  • Избегайте циклических переходов, не открывая новое соединение для каждой отдельной команды, и выполняйте вставки, используя одно соединение.
  • Убедитесь, что пул соединений с базой данных работает (не уверен, что это работает с соединениями OLEDB).
  • Попробуйте использовать более оптимизированный способ вставки данных.

Вы пробовали это?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}
1 голос
/ 01 октября 2008

Я протестировал этот код с базой данных Access 2007 без исключений (я поднялся до 13000 вставок).

Однако, что я заметил, это то, что это ужасно медленно, так как вы каждый раз создаете соединение. Если вы поместите «using (connection)» вне цикла, это будет происходить намного быстрее.

0 голосов
/ 20 января 2014

Это может происходить из-за того, что вы не удаляете созданный объект Connection и Command. Всегда удаляйте объект в конце.

OledbCommand.Dispose();
0 голосов
/ 11 февраля 2009

Я не уверен в специфике, но я столкнулся с подобной проблемой. Мы используем базу данных Access с IIS для обслуживания наших клиентов. У нас не очень много клиентов, но есть много соединений, которые открываются и закрываются в течение одного сеанса. Примерно через неделю работы мы получаем ту же ошибку, и все попытки подключения терпят неудачу. Чтобы исправить проблему, все, что нам нужно было сделать, это перезапустить рабочие процессы.

После некоторых исследований я обнаружил (конечно), что Access не работает хорошо в этой среде. Ресурсы не освобождаются правильно, и со временем исполняемый файл закончится. Чтобы решить эту проблему, мы собираемся перейти к базе данных Oracle. Если это не решит проблему, я буду держать вас в курсе моих выводов.

0 голосов
/ 01 октября 2008

В дополнение к вышесказанному (подключение к базе данных только один раз) я также хотел бы убедиться, что вы закрываете и удаляете свои подключения. Поскольку большинство объектов в c # управляются из памяти, соединения и потоки не всегда имеют такую ​​роскошь, поэтому, если такие объекты не удаляются, они не гарантируются для очистки. Это дает дополнительный эффект, оставляя это соединение открытым на весь срок действия вашей программы.

Также, если возможно, я бы посмотрел на использование транзакций. Я не могу сказать, для чего вы используете этот код, но OleDbTransactions полезны при вставке и обновлении многих строк в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...