超过了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数据库。如果这样做不能解决问题,我将向我们通报最新发现。