超过了OleDbException系统资源

时间:2020-03-06 14:57:30  来源:igfitidea点击:

以下代码执行一个简单的插入命令。如果连续调用2,000次(以插入2,000行),则会抛出OleDbException,消息为" System System Exceeded"。我还应该做些其他事情来释放资源吗?

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个)。

但是,我注意到的是,每次创建连接时,它的速度都非常慢。如果将" using(connection)"放到循环之外,它的运行速度会更快。

除了上述内容(仅连接到数据库一次)之外,我还想确保我们正在关闭并处置连接。由于大多数对象都由托管的wrt内存管理,因此连接和流并不总是那么奢侈,因此,如果不丢弃此类对象,就不能保证将其清除。这具有使连接在程序的整个生命周期中保持打开状态的添加效果。

另外,如果可能的话,我会考虑使用事务。我无法确定我们正在使用此代码做什么,但是在数据库中插入和更新许多行时,OleDbTransactions很有用。

我不确定具体细节,但是遇到了类似的问题。我们利用带有IIS的Access数据库为我们的客户提供服务。我们没有很多客户,但是在单个会话中有很多连接正在打开和关闭。工作约一周后,我们收到相同的错误,所有连接尝试均失败。要解决此问题,我们要做的就是重新启动工作进程。

经过研究,我发现(当然)Access在此环境中表现不佳。资源无法正确释放,随着时间的流逝,可执行文件将用完。为了解决这个问题,我们将移至Oracle数据库。如果这样做不能解决问题,我将向我们通报最新发现。