题
以下代码的执行插入一个简单的命令。如果它被称为2,000倍的连续(插入2,000行)的一个OleDbException有消息="系统资源超过了"被抛出。有没有别的东西我应该做的以免费了资源?
using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
解决方案
该系统的资源超出错误不是来自管理的码,它来自你杀死你的数据库(喷?)
你是开放的方式来很多连接的方式来快速的...
一些提示:
- 避免往返通过不打开一个新的连接,为每个单个指令,并执行插使用一个单一的连接。
- 确保数据库连接集工作(不确定如果适用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();