8

次のコードは、単純な挿入コマンドを実行します。(2,000 行を挿入するために) 2,000 回連続して呼び出されると、メッセージ = "System Resources Exceeded" の OleDbException がスローされます。リソースを解放するために他にすべきことはありますか?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
4

5 に答える 5

7

システム リソースの超過エラーはマネージ コードによるものではなく、データベースの強制終了によるものです (JET?)

あまりにも多くの接続を開いていますが、あまりにも速すぎます...

いくつかのヒント:

  • コマンドごとに新しい接続を開かないようにすることでラウンド トリップを回避し、単一の接続を使用して挿入を実行します。
  • データベース接続プーリングが機能していることを確認します。(それが OLEDB 接続で動作するかどうかは不明です。)
  • より最適化された方法でデータを挿入することを検討してください。

これを試しましたか?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}
于 2008-10-01T02:12:17.140 に答える
1

このコードを Access 2007 データベースでテストしましたが、例外はありませんでした (13000 回の挿入に達しました)。

ただし、毎回接続を作成しているため、非常に遅いことに気付きました。「using(connection)」をループの外に置くと、はるかに高速になります。

于 2008-10-01T02:46:57.773 に答える
0

詳細はわかりませんが、同様の問題が発生しました。クライアントにサービスを提供するために、IISでAccessデータベースを利用しています。クライアントはそれほど多くありませんが、1回のセッションで多くの接続が開かれたり閉じられたりします。約1週間の作業の後、同じエラーが発生し、すべての接続試行が失敗します。この問題を修正するには、ワーカープロセスを再起動するだけで済みました。

いくつかの調査の結果、(もちろん)Accessはこの環境ではうまく機能しないことがわかりました。リソースが正しく解放されず、時間の経過とともに実行可能ファイルが不足します。この問題を解決するために、Oracleデータベースに移動します。これで問題が解決しない場合は、調査結果を最新の状態に保ちます。

于 2009-02-11T16:08:13.063 に答える
0

上記 (データベースへの接続は 1 回のみ) に加えて、接続を閉じて破棄していることを確認したいと思います。C# のほとんどのオブジェクトはメモリで管理されているため、接続とストリームには常にこの余裕があるわけではないため、このようなオブジェクトが破棄されない場合、クリーンアップされる保証はありません。これには、プログラムの存続期間中、その接続を開いたままにしておくという追加の効果があります。

また、可能であれば、トランザクションの使用を検討します。このコードを何に使用しているのかわかりませんが、OleDbTransactions は、データベースに多数の行を挿入および更新するときに役立ちます。

于 2008-10-01T03:29:22.760 に答える
-1

これは、作成された Connection および Command オブジェクトを破棄していないために発生している可能性があります。常に最後にオブジェクトを破棄します。

OledbCommand.Dispose();
于 2014-01-20T06:40:18.410 に答える