2008-10-01 31 views
7

Đoạn mã sau thực thi lệnh chèn đơn giản. Nếu nó được gọi là 2.000 lần liên tiếp (để chèn 2.000 hàng) một OleDbException với message = "System Resources Exceeded" được ném. Có điều gì khác tôi nên làm để giải phóng tài nguyên không?Tài nguyên hệ thống OleDbException Đã vượt quá

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

Trả lời

5

Các tài nguyên hệ thống vượt quá lỗi không đến từ mã được quản lý, đến từ bạn giết cơ sở dữ liệu của bạn (JET?)

Bạn đang mở đường để nhiều kết nối, cách để nhanh chóng ...

một số lời khuyên:

  • Tránh roundtrips bằng cách không mở một kết nối mới cho mỗi lệnh duy nhất, và thực hiện việc chèn sử dụng một kết nối duy nhất.
  • Đảm bảo rằng nhóm kết nối cơ sở dữ liệu đang hoạt động (Không chắc chắn liệu kết nối đó có hoạt động với kết nối OLEDB) hay không.
  • Cân nhắc sử dụng cách tối ưu hơn để chèn dữ liệu.

Bạn đã thử cái này chưa?

using (OleDBConnection conn = new OleDBConnection(connstr)) 
{ 
    while (IHaveData) 
    { 
     using (OldDBCommand cmd = new OldDBCommand()) 
     { 
      cmd.Connection = conn; 
      cmd.ExecuteScalar(); 
     } 
    } 
} 
+0

Tôi gặp vấn đề tương tự và di chuyển câu lệnh 'using()' bên ngoài vòng lặp không chỉ loại trừ ngoại lệ mà còn tăng tốc độ một cách đáng kể. Cảm ơn. –

1

Tôi đã thử nghiệm mã này với cơ sở dữ liệu Access 2007 không có ngoại lệ (tôi đã cao tới 13000 lần chèn).

Tuy nhiên, những gì tôi nhận thấy là nó cực kỳ chậm khi bạn tạo kết nối mỗi lần. Nếu bạn đặt "sử dụng (kết nối)" bên ngoài vòng lặp, nó đi nhanh hơn nhiều.

0

Ngoài những điều trên (chỉ kết nối với cơ sở dữ liệu một lần), tôi cũng muốn đảm bảo bạn đang đóng và hủy kết nối của mình. Vì hầu hết các đối tượng trong C# đều được quản lý bộ nhớ wrt, các kết nối và các luồng không có sự sang trọng này, vì vậy nếu các đối tượng như thế này không được xử lý, chúng không được bảo đảm để làm sạch. Điều này có tác dụng bổ sung để lại kết nối đó mở cho cuộc đời của chương trình của bạn.

Ngoài ra, nếu có thể, tôi sẽ xem xét sử dụng Giao dịch. Tôi không thể nói những gì bạn đang sử dụng mã này cho, nhưng OleDbTransactions rất hữu ích khi chèn và cập nhật nhiều hàng trong một cơ sở dữ liệu.

+0

lệnh "sử dụng" phân phối các kết nối được tạo ra –

0

Tôi không chắc chắn về các chi tiết cụ thể nhưng tôi đã gặp phải một vấn đề tương tự. Chúng tôi sử dụng cơ sở dữ liệu Access với IIS để phục vụ khách hàng của mình. Chúng tôi không có nhiều khách hàng nhưng có rất nhiều kết nối được mở và đóng trong một phiên duy nhất. Sau khoảng một tuần làm việc, chúng tôi nhận được cùng một lỗi và mọi nỗ lực kết nối đều thất bại. Để khắc phục sự cố, tất cả những gì chúng tôi phải làm là khởi động lại quy trình công nhân.

Sau một số nghiên cứu, tôi thấy (tất nhiên) Access không hoạt động tốt trong môi trường này. Tài nguyên không được phát hành chính xác và theo thời gian tệp thực thi sẽ hết. Để giải quyết vấn đề này, chúng ta sẽ chuyển sang cơ sở dữ liệu Oracle. Nếu điều này không khắc phục được sự cố, tôi sẽ cập nhật cho bạn về những phát hiện của tôi.

+0

Bạn có nguồn để sao lưu điều này không? – Ian

+0

Tôi không nhớ nguồn của mình, đã lâu rồi. Nhưng ở nhiều nơi trên mạng tôi đã tìm thấy nhiều ý kiến ​​cho rằng vấn đề này không tồn tại. Xin lỗi tôi không có thêm thông tin. – Krucible

-1

Điều này có thể xảy ra vì bạn không xử lý đối tượng Kết nối và Lệnh được tạo. Luôn Vứt bỏ vật thể ở cuối.

OledbCommand.Dispose(); 
+1

Sau khi thoát khỏi phạm vi "sử dụng" đối tượng sẽ được xử lý. Đó là cách "sử dụng" hoạt động – MikkaRin

Các vấn đề liên quan