OleDbException超出系统资源

以下代码执行简单的插入命令。 如果连续调用2000次(插入2,000行),则抛出带有message =“System Resources Exceeded”的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在插入和更新数据库中的许多行时非常有用。

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

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

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

 OledbCommand.Dispose();