Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ORACLE / ASP.NET:ORA-2020 - Quá nhiều liên kết cơ sở dữ liệu ... điều gì gây ra điều này?

Thứ nhất, giải pháp đơn giản:Tôi muốn kiểm tra lại xem trong cơ sở dữ liệu sản xuất, số lượng liên kết mặc định có thực sự là không 4.

select *
  from v$system_parameter
 where name = 'OPEN_LINKS'

Giả sử bạn sẽ không thực hiện điều đó một cách nhẹ nhàng:

Bạn nói rằng bạn đóng phiên một cách rõ ràng, theo tài liệu , có nghĩa là tất cả các liên kết được liên kết với phiên đó đều bị đóng. Ngoài ra, tôi thú nhận hoàn toàn không biết về điểm này.

Không có bất kỳ nhược điểm nào mà tôi có thể nghĩ ra. Tom Kyte gợi ý , mặc dù cách đây đã lâu, mỗi liên kết cơ sở dữ liệu đang mở sử dụng 500 nghìn bộ nhớ PGA. Nếu bạn không có thì điều này rõ ràng sẽ gây ra vấn đề nhưng nó sẽ tốt hơn cho hầu hết các tình huống.

Tuy nhiên, có những hậu quả không mong muốn:Hãy tưởng tượng rằng bạn tăng con số này lên 100. Ai đó mã hóa thứ gì đó liên tục mở liên kết và lấy rất nhiều dữ liệu thông qua tất cả chúng select * from my_massive_table hoặc tương tự. Thay vì 4 phiên làm điều này, bạn có 100, đang cố gắng chuyển hàng trăm gigabyte đồng thời. Mạng của bạn chết vì căng thẳng ...

Có thể còn nhiều hơn nhưng bạn sẽ có được bức tranh.

Như bạn đã lưu ý, câu trả lời tốt nhất là "có thể là không", điều này không giúp ích nhiều. Bạn không đề cập chính xác cách bạn kết thúc phiên nhưng nếu bạn đang giết nó thay vì đóng một cách duyên dáng thì chắc chắn.

Sử dụng liên kết cơ sở dữ liệu tạo ra một tiến trình con trên máy chủ từ xa. Bởi vì máy chủ của bạn không còn chịu trách nhiệm tuyệt đối cho quá trình này, nên có vô số điều có thể khiến nó trở nên mồ côi hoặc không thể đóng khi kết thúc quy trình gốc. Không có nghĩa là điều này xảy ra toàn bộ thời gian nhưng nó có thể và có.

Tôi sẽ làm hai việc.

  1. Trong quá trình của bạn, nếu gặp một ngoại lệ, hãy gửi email kết quả của truy vấn sau cho chính bạn.

    select * 
      from v$dblink
    

    Ít nhất thì ít nhất bạn sẽ biết những liên kết cơ sở dữ liệu nào đang mở trong phiên và cung cấp cho bạn một số cách để theo dõi chúng.

  2. Làm theo lời khuyên về tài liệu; cụ thể như sau:

    "Bạn có thể có dịp đóng liên kết theo cách thủ công. Ví dụ:liên kết đóng khi:

    • Kết nối mạng được thiết lập bởi một liên kết không thường xuyên được sử dụng trong một ứng dụng.
    • Phiên người dùng phải được chấm dứt. "

Đầu tiên dường như hoàn toàn phù hợp với hoàn cảnh của bạn. Trừ khi quy trình của bạn nhạy cảm về thời gian, điều này dường như không đúng với trường hợp này, thì bạn còn gì để mất? Cú pháp là:

alter session close database link <linkname>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:năm phải nằm trong khoảng -4713 đến +9999 và không được bằng 0

  2. Chuỗi cập nhật trong Oracle với mili giây

  3. Hàm hoặc Thủ tục cho mệnh đề IN

  4. Oracle JDBC ojdbc6 Jar làm phụ thuộc Maven

  5. Thiết kế con dành cho cha mẹ để dễ dàng xác định loại con