超过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();
}
系统资源超出错误不是来自托管代码,而是来自您杀死数据库(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();