Вопрос

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

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
Это было полезно?

Решение

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

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

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

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

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

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

Другие советы

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

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

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

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

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

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

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

OledbCommand.Dispose();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top