超过OleDbException系统资源

本文关键字:系统资源 OleDbException 超过 | 更新日期: 2023-09-27 17:48:53

下面的代码执行一个简单的insert命令。如果它被连续调用2000次(以插入2000行),则抛出消息为"System Resources Exceeded"的OleDbException。我还应该做些什么来释放资源吗?

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

超过OleDbException系统资源

系统资源超出错误不是来自托管代码,而是来自您杀死数据库(JET?)

你打开的连接太多,太快。。。

一些提示:

  • 不为每个命令打开新的连接,避免往返,并使用单个连接执行插入
  • 确保数据库连接池正常工作。(不确定这是否适用于OLEDB连接。)
  • 考虑使用更优化的方式插入数据

你试过这个吗?

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

我在Access 2007数据库中测试了这段代码,没有任何异常(我插入了13000个)。

然而,我注意到它非常慢,因为你每次都在创建连接。如果你把"using(connection)"放在循环之外,它会运行得更快。

除了以上(只连接到数据库一次),我还想确保您正在关闭并处理您的连接。由于c#中的大多数对象都是由wrt内存管理的,所以连接和流并不总是有这种奢侈,所以如果不处理这样的对象,就不能保证它们会被清理掉。这还有一个额外的效果,就是在程序的生命周期中保持这种连接。

此外,如果可能的话,我会考虑使用Transactions。我不知道你用这段代码做什么,但OleDbTransactions在数据库中插入和更新许多行时很有用。

我不确定具体情况,但我遇到过类似的问题。我们利用带有IIS的Access数据库为客户提供服务。我们没有太多的客户端,但在一个会话中有很多连接被打开和关闭。经过大约一周的工作,我们收到了同样的错误,所有连接尝试都失败了。为了纠正这个问题,我们所要做的就是重新启动工作进程。

经过一些研究,我发现(当然)Access在这种环境下表现不佳。资源没有得到正确释放,随着时间的推移,可执行文件将耗尽。为了解决这个问题,我们将使用Oracle数据库。如果这不能解决问题,我会随时向您通报我的最新发现。

这可能是因为您没有处理创建的Connection和Command对象。始终在最后处置对象。

OledbCommand.Dispose();