Превышены системные ресурсы OleDbException

Следующий код выполняет простую команду вставки. Если он вызывается 2000 раз подряд (для вставки 2000 строк), создается исключение OleDbException с сообщением = «Превышены системные ресурсы». Есть ли что-то еще, что я должен сделать, чтобы высвободить ресурсы?

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

person Pauly    schedule 01.10.2008    source источник


Ответы (5)


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

Вы открываете слишком много контактов, слишком быстро...

Некоторые советы:

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

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

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}
person FlySwat    schedule 01.10.2008
comment
У меня была аналогичная проблема, и перемещение оператора using() за пределы цикла не только избавило от исключения, но и резко увеличило скорость. Спасибо. - person dub stylee; 24.02.2014
comment
Поставщик данных .NET Framework для OLE DB автоматически объединяет соединения с помощью объединения сеансов OLE DB. Это можно отключить в строке подключения, установив OLE DB Services. - person Mike Lowery; 15.07.2020

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

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

person Austin Salonen    schedule 01.10.2008

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

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

person Fry    schedule 01.10.2008
comment
Правильная утилизация объектов - это весь смысл его using утверждений. - person Mike Lowery; 15.07.2020

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

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

person Krucible    schedule 11.02.2009
comment
У вас есть источник, подтверждающий это? - person Ian; 17.01.2012
comment
Я не помню свои источники, это было слишком долго. Но во многих местах в сети я нашел много комментариев о том, что эта проблема действительно существует. Извините, у меня нет дополнительной информации. - person Krucible; 21.02.2012

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

OledbCommand.Dispose();
person jaymeht    schedule 20.01.2014
comment
После выхода из области использования объект будет удален. Вот как работает использование - person MikkaRin; 09.09.2016